将JSON字符串反序列化为类

时间:2013-11-04 16:51:43

标签: c# json c#-4.0

我有一个非常简单的DataContract类,我需要反序列化。我没有出于特殊原因使用JSON.NET,因此请使用DataContractJsonSerializer。

我的合同类看起来像这样

[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字符串,但在反序列化时,尽管传递的值为非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。空)

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

1 个答案:

答案 0 :(得分:1)

由于您的C#类属性(例如ResponseCode)和JSON名称(例如RespCode)不匹配,您需要在Name中指定DataMemberd属性。具有ResponseClassContainer的结构可以由另一个类(我为其创建DataContract)表示,而不是简单地命名d 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整数和{{1}}字符串,因为它们是各自类型的默认值。由于字符串没有任何公认的数据,所以那些都是那里设置的。