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。

我的反序列化代码看起来像这样

    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
    }
}
4

1 回答 1

1

由于您的 C# 类属性(例如ResponseCode)和 JSON 名称(例如RespCode)不匹配,因此您需要在属性中指定这些Names 。DataMember带有 的结构d可以由另一个类(我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字符串是因为它们是它们各自类型的默认值。由于该字符串没有任何可识别的数据,因此这些都是曾经在那里设置的。

于 2013-11-04T17:06:49.437 回答