将 json 从字符串反序列化为 DataContract 的方法中的匿名类型

Anonymous type in method for Deserializing json from a string to DataContract

我正在尝试编写一个匿名方法以将 Json 反序列化为 DataContract。这将允许我有一些可重用的东西,而不必为我为每个 json 查询编写的每个 DataContract class 编写相同的代码。

我目前的代码如下:

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 中给我错误如下:

如何在不对类型进行硬编码的情况下进行调整,使其按我的预期工作?

as 关键字表示该类型是引用类型,而不是值类型。您不能将 null 存储在值类型中。因此,您要么需要将类型 T 限制为引用类型:

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

cast而不是使用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;
}