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"类型定义无参数构造函数。
您可以使用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()
{
...
}
}
这可能不是你现在最大的问题,但我没看到有人回答这部分问题。