【问题标题】:Deserialize JSON string to a class将 JSON 字符串反序列化为类
【发布时间】:2013-11-05 01:09:29
【问题描述】:

我有一个非常简单的 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.空)

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

【问题讨论】:

  • 很抱歉,您的回答没有详细信息,我无法完全理解您的问题。 “末尾的值”始终为零或 string.Empty 是什么意思?您是指最后一个数据成员“响应”属性吗? “尽管传入了值”,您是指将值传递到您的 private string deserializeJSON(string resp, bool code = false) 方法中吗?

标签: c# json c#-4.0


【解决方案1】:

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

【讨论】:

  • 我明白了——谢谢你的解释。正如我所说,通常情况下,我会为此使用 JSON.NET,因为它可以让生活变得简单,但我特别需要这样做 - 感谢您的回答:)
猜你喜欢
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多