2016-12-29 43 views
0

我想写一个匿名方法用于将Json反序列化到DataContract。这使我可以重新使用某些东西,而无需为每个为每个json查询写的每个DataContract类编写相同的代码。匿名类型的反序列化json从字符串到DataContract的方法

我到目前为止的代码,如下所示:

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如下:

error

怎么可以这样不硬调整编码的类型,使其按我的意图工作?

回答

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; 
} 
+0

非常好,谢谢你。如果你有'T:class'的地方,我需要用特定的类来替换'class'。例如,如果我的datacontract类被命名为'Foo',那么它会被写为'where T:Foo'还是说'where T:class'仍然可以像你写的那样工作? –

+1

@KraangPrime Nope,'T:class'正是你需要写的东西。它将'T'限制为*引用类型*。请注意,由于'int'是一个值类型,所以你将被禁止编写'Json2Object (someJson,someEncoding)'。如果你想能够传入'int',你需要使用转换方法。 – Rob

+1

太棒了。正是我需要的。谢谢 :) –