JavaScriptSerializer在单个字符串中反序列化多个JSON数组

时间:2014-09-08 12:51:47

标签: c# json wcf rest serialization

简而言之,我有一个客户端Windows窗体应用程序,它以下列形式从API接收Json字符串:

string textResult = "{"Data":[{"ID":"G0000013","M_CurBalanceOutstanding":52408.5}],"DataDetail":[{"ErrorDate":"\/Date(1410179960809+0200)\/","ErrorID":1,"ErrorInfo":"Success"}]}"

或通过http://www.jsoneditoronline.org/

格式化
{
  "Data": [
    {
      "ID": "G0000013",
      "M_CurBalanceOutstanding": 52408.5
    }
  ],
  "DataDetail": [
    {
      "ErrorDate": "/Date(1410164281557+0200)/",
      "ErrorID": 1,
      "ErrorInfo": "Success"
    }
  ]
}

我试图像这样反序列化:

var deserializer = new JavaScriptSerializer();
List<MatterDetailBalOutstanding> results = deserializer.Deserialize<List<MatterDetailBalOutstanding>>(textResult);

其中textresult是我的JSon字符串。

我有以下课程:

[DataContract]
    class MatterDetailBalOutstanding
    {
        [DataMember]
        public string ID { get; set; }

        [DataMember]
        public decimal M_CurBalanceOutstanding { get; set; }

        [DataMember]
        public List<MatterReturnStatusDetails> ErrorData;

        public MatterDetailBalOutstanding(string _ID, decimal _M_CurBalanceOutstanding, List<MatterReturnStatusDetails> _ErrorData)
        {
            ID = _ID;
            M_CurBalanceOutstanding = _M_CurBalanceOutstanding;
            ErrorData = _ErrorData;
        }
    }

[DataContract]
    class MatterReturnStatusDetails
    {
        [DataMember]
        public int ID { get; set; }

        [DataMember]
        public string Info { get; set; }

        [DataMember]
        public DateTime Date { get; set; }

        public MatterReturnStatusDetails(int _ID, string _Info, DateTime _Date)
        {
            ID = _ID;
            Info = _Info;
            Date = _Date;
        }
    }

我无法让它发挥作用?根据我的理解,可以反序列化包含两个JSon数组的字符串。我已经阅读了很多线程,其中很多都建议使用另一个序列化程序。我必须使用JavaScriptSerializer。请有人帮忙吗?我究竟做错了什么?我在哪里错过了什么?

更新1:

当我尝试:

MatterDetailBalOutstanding results = deserializer.Deserialize<MatterDetailBalOutstanding>(textResult);

我收到以下错误:

没有为&#39; ConsumeTestWCFApp.ConsumeTestWCFApp + MatterDetailBalOutstanding&#39;的类型定义无参数构造函数。

2 个答案:

答案 0 :(得分:2)

您可以使用json2csharp来帮助您生成适合映射JSON的类。结果如下:

public class Datum
{
    public string ID { get; set; }
    public double M_CurBalanceOutstanding { get; set; }
}

public class DataDetail
{
    public DateTime ErrorDate { get; set; }
    public int ErrorID { get; set; }
    public string ErrorInfo { get; set; }
}

public class RootObject
{
    public List<Datum> Data { get; set; }
    public List<DataDetail> DataDetail { get; set; }
}

然后,您可以根据需要进一步注释和修改生成的类,并在反序列化中使用它:

var result = deserializer.Deserialize<RootObject>(textResult);

答案 1 :(得分:0)

这个问题:

  

没有为类型定义无参数构造函数   &#39; ConsumeTestWCFApp.ConsumeTestWCFApp + MatterDetailBalOutstanding&#39;

发生

是因为序列化类没有默认构造函数。通过创建这样的特定构造函数:

class MatterDetailBalOutstanding
{
    public MatterDetailBalOutstanding(string _ID, decimal _M_CurBalanceOutstanding, List<MatterReturnStatusDetails> _ErrorData)
    {
      ...
    }
}

你没有得到默认的构造函数,必须自己添加一个:

class MatterDetailBalOutstanding
{
    public MatterDetailBalOutstanding(string _ID, decimal _M_CurBalanceOutstanding, List<MatterReturnStatusDetails> _ErrorData)
    {
      ...
    }

    public MatterDetailBalOutstanding()
    {
      ...
    }
}

这可能不是你现在最大的问题,但我没有看到有人回答这部分问题。