2013-11-04 151 views
0

我有一个非常简单的DataContract类,我需要反序列化到。我没有使用JSON.NET的特殊原因,所以使用DataContractJsonSerializer。反序列化JSON字符串到类

我的合同类看起来像这样

[DataContract(Name = "d")] 
    public class ResponseClass 
    { 
     [DataMember] 
     public int ResponseCode 
     { get; set;} 
     [DataMember] 
     public string ResponseMessage 
     { get; set;} 
     [DataMember] 
     public string Response 
     { get; set;} 
    } 

服务调用与有效的JSON字符串回来了,但在deserialising,在最后的值始终为0或不顾的String.Empty传递的价值在非0或非string.Empty。

我deserialise代码如下所示

private string deserializeJSON(string resp, bool code = false) 
    { 
     string value = string.Empty; 
     ResponseClass deserialized = null; 
     using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(resp))) 
     { 
      stream.Position = 0; 
      var ser = new DataContractJsonSerializer(typeof(ResponseClass)); 
      deserialized = ser.ReadObject(stream) as ResponseClass; 
     } 
     value = code ? deserialized.Response : deserialized.ResponseCode.ToString(); 
     return value; 
    } 

我环顾四周,对这个答案,但没有被弹回。

数据返回看起来像这样(这就是为什么合约返回被称为“d” - 不知道这是否有所作为,但结果仍然相同,RespCode为0,RespMess,Resp = string .Empty)

{ 
    "d": 
    { 
     "RespCode": 0, 
     "RespMess": null, 
     "Resp": null 
    } 
} 
+1

对不起,但您的答案没有enuf详细资料,我完全理解您的问题。 “结尾的价值”是什么意思总是零或字符串。是空的?你的意思是最后一个数据成员“响应”属性?通过“尽管值被传入”,你的意思是将值传递给你的私有字符串deserializeJSON(string resp,bool code = false)'方法吗? – Edward

回答

1

由于您的C#类的属性(如ResponseCode)和JSON的名称(如RespCode)不匹配,你需要在你DataMember属性指定这些Name秒。而d的结构可以由另一个类(我为它制作ResponseClassContainer)代表,而不是简单地命名为DataContractd。这工作:

private string deserializeJSON(string resp, bool code = false) 
{ 
    string value = string.Empty; 
    ResponseClass deserialized = null; 
    using (MemoryStream stream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(resp))) 
    { 
     stream.Position = 0; 
     var ser = new DataContractJsonSerializer(typeof(ResponseClassContainer)); 
     deserialized = (ser.ReadObject(stream) as ResponseClassContainer).d; 
    } 
    value = code ? deserialized.Response : deserialized.ResponseCode.ToString(); 
    return value; 
} 
[DataContract] 
public class ResponseClassContainer 
{ 
    [DataMember] 
    public ResponseClass d { get; set; } 
} 
[DataContract] 
public class ResponseClass 
{ 
    [DataMember(Name="RespCode")] 
    public int ResponseCode 
    { get; set;} 
    [DataMember(Name="RespMess")] 
    public string ResponseMessage 
    { get; set;} 
    [DataMember(Name="Resp")] 
    public string Response 
    { get; set;} 
} 

0整数和null串存在,因为这些都是为各自类型的默认值。由于该字符串没有任何可识别的数据,所有这些都是在那里设置的。

+0

我看到了 - 谢谢你的解释。正如我所说,通常,我只是使用JSON.NET,因为它为简单的生活,但我有一个特定的需要这样做 - 谢谢你的答案:) – Nodoid