C# 尝试使用JSON.NET和DataContractJsonSerializer反序列化JSON失败
请帮帮我,我卡住了。 我有一个WCF服务,它返回如下内容:C# 尝试使用JSON.NET和DataContractJsonSerializer反序列化JSON失败,c#,.net,json,json.net,datacontractserializer,C#,.net,Json,Json.net,Datacontractserializer,请帮帮我,我卡住了。 我有一个WCF服务,它返回如下内容: { "GetDataRESTResult": [ {"Key1":100.0000,"Key2":1,"Key3":"Min"}, {"Key1":100.0000,"Key2":2,"Key3":"Max"} ] } public class DataDC { public List<Keys> GetDataRESTResult { get; set; }
{
"GetDataRESTResult":
[
{"Key1":100.0000,"Key2":1,"Key3":"Min"},
{"Key1":100.0000,"Key2":2,"Key3":"Max"}
]
}
public class DataDC
{
public List<Keys> GetDataRESTResult { get; set; }
}
public class Keys
{
public double Key1 { get; set; }
public int Key2 { get; set; }
public string Key3 { get; set; }
}
我想反序列化它,但无论我使用什么(JSON.NET或DataContractJsonSerializer),我都会遇到错误。
使用DataContractJsonSerializer时,我使用的是其代码:
byte[] data = Encoding.UTF8.GetBytes(e.Result);
MemoryStream memStream = new MemoryStream(data);
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(List<DataDC>));
List<DataDC> pricinglist = (List<DataDC>)serializer.ReadObject(memStream);
byte[]data=Encoding.UTF8.GetBytes(e.Result);
MemoryStream memStream=新的MemoryStream(数据);
DataContractJsonSerializer serializer=新的DataContractJsonSerializer(typeof(List));
List pricinglist=(List)serializer.ReadObject(memStream);
其中DataDC是我从WCF REST服务的服务引用中获得的数据协定,我从中获得JSON数据,我得到的错误是InvalidCastException
尝试使用JSON.NET时,我遇到了另一个例外,但我仍然无法找出答案,有人能帮忙吗
编辑
下面是一个JSON.NET堆栈跟踪:
无法反序列化当前JSON对象(例如{“名称”:“值”})
打字
'System.Collections.Generic.List'1[MyApp.MyServiceReference.DataDC]'
因为该类型需要一个JSON数组(例如[1,2,3])来反序列化
正确地要修复此错误,请将JSON更改为JSON数组
(例如[1,2,3])或更改反序列化类型,使其成为正常类型
.NET类型(例如,不是integer之类的基元类型,也不是集合
可以从JSON反序列化的类型(如数组或列表)
对象还可以将JsonObjectAttribute添加到类型以强制它
从JSON对象反序列化。路径“GetDataResult”,第1行,
立场23
下面的代码有效
string json = @" {""GetDataRESTResult"":[{""Key1"":100.0000,""Key2"":1,""Key3"":""Min""},{""Key1"":100.0000,""Key2"":2,""Key3"":""Max""}]}";
dynamic dynObj = JsonConvert.DeserializeObject(json);
foreach (var item in dynObj.GetDataRESTResult)
{
Console.WriteLine("{0} {1} {2}", item.Key1, item.Key3, item.Key3);
}
您也可以使用Linq
var jObj = (JObject)JsonConvert.DeserializeObject(json);
var result = jObj["GetDataRESTResult"]
.Select(item => new
{
Key1 = (double)item["Key1"],
Key2 = (int)item["Key2"],
Key3 = (string)item["Key3"],
})
.ToList();
下面的代码有效
string json = @" {""GetDataRESTResult"":[{""Key1"":100.0000,""Key2"":1,""Key3"":""Min""},{""Key1"":100.0000,""Key2"":2,""Key3"":""Max""}]}";
dynamic dynObj = JsonConvert.DeserializeObject(json);
foreach (var item in dynObj.GetDataRESTResult)
{
Console.WriteLine("{0} {1} {2}", item.Key1, item.Key3, item.Key3);
}
您也可以使用Linq
var jObj = (JObject)JsonConvert.DeserializeObject(json);
var result = jObj["GetDataRESTResult"]
.Select(item => new
{
Key1 = (double)item["Key1"],
Key2 = (int)item["Key2"],
Key3 = (string)item["Key3"],
})
.ToList();
{“GetDataResult”:[{“Key1”:100.0000,“Key2”:1,“Key3”:“Min”},{“Key1”:100.0000,“Key2”:2,“Key3”:“Max”}
您的数据是一个JSON对象(其中有一个键'GetDataResult',值为JSON数组)。因此,您应该反序列化到的类型应该是对象,而不是集合
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataDC));
DataDC pricinglist = (DataDC)serializer.ReadObject(memStream);
如果您的类型DataDC如下所示,则它将起作用:
{
"GetDataRESTResult":
[
{"Key1":100.0000,"Key2":1,"Key3":"Min"},
{"Key1":100.0000,"Key2":2,"Key3":"Max"}
]
}
public class DataDC
{
public List<Keys> GetDataRESTResult { get; set; }
}
public class Keys
{
public double Key1 { get; set; }
public int Key2 { get; set; }
public string Key3 { get; set; }
}
公共类DataDC
{
公共列表GetDataRESTResult{get;set;}
}
公共类密钥
{
双公钥1{get;set;}
public int Key2{get;set;}
公共字符串Key3{get;set;}
}
{“GetDataResult”:[{“Key1”:100.0000,“Key2”:1,“Key3”:“Min”},{“Key1”:100.0000,“Key2”:2,“Key3”:“Max”}
您的数据是一个JSON对象(其中有一个键'GetDataResult',值为JSON数组)。因此,您应该反序列化到的类型应该是对象,而不是集合
DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataDC));
DataDC pricinglist = (DataDC)serializer.ReadObject(memStream);
如果您的类型DataDC如下所示,则它将起作用:
{
"GetDataRESTResult":
[
{"Key1":100.0000,"Key2":1,"Key3":"Min"},
{"Key1":100.0000,"Key2":2,"Key3":"Max"}
]
}
public class DataDC
{
public List<Keys> GetDataRESTResult { get; set; }
}
public class Keys
{
public double Key1 { get; set; }
public int Key2 { get; set; }
public string Key3 { get; set; }
}
公共类DataDC
{
公共列表GetDataRESTResult{get;set;}
}
公共类密钥
{
双公钥1{get;set;}
public int Key2{get;set;}
公共字符串Key3{get;set;}
}
Maggie,非常感谢您的回答,不幸的是,我无法更改DataDC,因为它是自动生成的,并取自名为GetDataREST()的WCF REST服务方法,该方法未设置为以裸格式发送JSON,这就是它添加GetDataResult JSON键的原因……您的答案非常有用,这就是为什么我投了赞成票,但我仍然希望使用服务引用的DC,而不是每次它可能发生变化时都必须编写自己的DC…这就是为什么我选择了第二个答案,希望能将数据DC应用于jObj[“GetDataRESTResult”]对象easyMaggie,非常感谢您的回答,不幸的是,我无法更改DataDC,因为它是自动生成的,并取自名为GetDataREST()的WCF REST服务方法,该方法未设置为以裸格式发送JSON,这就是它添加GetDataResult JSON键的原因……您的答案非常有用,这就是我投票支持它的原因,但我仍然希望使用服务引用的DC,而不是每次它可能发生变化时都要编写自己的DC…这就是为什么我选择了第二个答案,希望能轻松地将DataDC应用于jObj[“GetDataRESTResult”]对象