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

本文关键字:JSON 数组 反序列化 单个 字符串 JavaScriptSerializer | 更新日期: 2023-09-27 18:20:59

简而言之,我有一个客户端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);

我得到以下错误:

没有为"ConsumeTestWCFApp.ConsumeTestWCFA pp+MatterDetailBalOutstanding"类型定义无参数构造函数。

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

您可以使用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);

此问题:

没有为的类型定义无参数构造函数'ConsumeTestWCFApp.ConsumeTestWCFA pp+MatterDetailBalOutstanding'。

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

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()
    {
      ...
    }
}

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