2016-12-29 77 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

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

相關問題