简而言之,我有一个客户端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;的类型定义无参数构造函数。
答案 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()
{
...
}
}
这可能不是你现在最大的问题,但我没有看到有人回答这部分问题。