2013-07-01 34 views
1

我想反序列化一个包含单个成员的JSON对象;一个字符串数组:使用C#中的DataContractJsonSerializer以List <>反序列化JSON对象

{"errores":[{"errorCode":"campo1","errorMessage":"Errorenelcampo1"},{"errorCode":"campo2","errorMessage":"Errorenelcampo2"},{"errorCode":"campo3","errorMessage":"Errorenelcampo3"},{"errorCode":"campo4","errorMessage":"Errorenelcampo4"}]}" 

这是我尝试反序列化到类:

[DataContract] 
internal class rptaNo 
{ 
    [DataMember] 
    public List<Errors> errores { get; set; } 

    [DataContract] 
    protected internal struct Errors 
    { 
     [DataMember] 
     public string codigo { get; set; } 
     [DataMember] 
     public string descripcion { get; set; } 
    } 
} 

这是我尝试反序列化方法:

public T Deserialise<T>(string json) 
{ 
    DataContractJsonSerializer deserializer = new DataContractJsonSerializer(typeof(T)); 
    using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(json))) 
    { 
     T result = (T)deserializer.ReadObject(stream); 
     return result; 
    } 
} 

但是,当我检查,子列表的所有字段都是空白的,例如

MessageBox.Show(deserializedRpta2.errores[0].descripcion); 

我想一定是我丢失的东西=(

+0

你有没有尝试'System.Web.Script.Serialization。 JavascriptSerializer'? – Olrac

+0

[在C#中使用DataContractJsonSerializer反序列化JSON对象](http://stackoverflow.com/questions/17409655/deserialization-of-json-object-by-using-datacontractjsonserializer-in-c-sharp) –

回答

4

模型需要有匹配的JSON对象的名称是属性:

[DataContract] 
protected internal struct Errors 
{ 
    [DataMember] 
    public string errorCode { get; set; } 
    [DataMember] 
    public string errorMessage { get; set; } 
} 
+1

I建议使用[DataMember的Name属性](http://msdn.microsoft.com/zh-cn/library/system.runtime.serialization.datamemberattribute.name.aspx)。它使得“无害”的重构不太可能破坏现有的合同。 – user2246674

+0

谢谢!试试吧,它的工作原理。 – stvn03

+0

@ stvn03如果一个答案适合你,你通常会接受它,所以未来的访问者可以很快看到它解决了这个问题。 –

相关问题