Метод анонимного ввода для десериализации json из строки в DataContract

Я пытаюсь написать анонимный метод с целью десериализации Json в DataContract. Это позволило бы мне использовать что-то повторно, без необходимости писать один и тот же код для каждого класса DataContract, который я написал для каждого запроса json.

Код, который я до сих пор, выглядит следующим образом:

public T Json2Object<T>(string json, Encoding encoding) {
    T result;
    DataContractJsonSerializer ser = new DataContractJsonSerializer( typeof( T ) );
    using ( Stream s = new MemoryStream( ( encoding ?? Encoding.UTF8 ).GetBytes( json ?? "" ) ) ) {
        result = ser.ReadObject( s ) as T;
    }
    return result;
}

Это дает мне ошибки в IDE следующим образом:

ошибка

Как это можно настроить без жесткого кодирования типа, чтобы он работал так, как я намереваюсь?

1 ответ

Решение

as Ключевое слово подразумевает, что тип является ссылочным типом, а не типом значения. Вы не можете хранить null в типе значения. Таким образом, вам либо нужно ограничить тип T к ссылочному типу:

public T Json2Object<T>(string json, Encoding encoding) where T : class {
    // ...
}

Или использовать, а не использовать as:

public T Json2Object<T>(string json, Encoding encoding) {
    T result;
    DataContractJsonSerializer ser = new DataContractJsonSerializer( typeof( T ) );
    using ( Stream s = new MemoryStream( ( encoding ?? Encoding.UTF8 ).GetBytes( json ?? "" ) ) ) {
        result = (T)ser.ReadObject( s );
    }
    return result;
}
Другие вопросы по тегам