C# 尝试使用JSON.NET和DataContractJsonSerializer反序列化JSON失败

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; }

请帮帮我,我卡住了。 我有一个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; }
}
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”]对象