Метод анонимного ввода для десериализации 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;
}