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

2019-10-17 07:18发布

plz帮助,我卡住了。 我有它返回这样的一个WCF服务:

{
   "GetDataRESTResult":
     [
       {"Key1":100.0000,"Key2":1,"Key3":"Min"},
       {"Key1":100.0000,"Key2":2,"Key3":"Max"}
     ]
}

我想反序列化,但无论我用(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);

其中DataDC是我从WCF REST服务,我从获取JSON数据的服务引用了数据的合同,而我得到的错误是InvalidCastException的...

尝试使用JSON.NET我得到另一个异常,但仍没有我可以计算出,任何人都可以帮助吗?

编辑在这里是一个JSON.NET堆栈跟踪:

无法反序列化当前JSON对象(例如{“名称”:“值”})成型“System.Collections.Generic.List`1 [MyApp.MyServiceReference.DataDC]”,因为类型要求JSON阵列(例如[1,2 2,3]),以正确地反序列化。 为了解决这个问题错误或者改变JSON到JSON阵列(例如[1,2,3]),或改变它的反序列化类型,以便它是一个正常的.NET类型(例如不是原始类型像整数,而不是集合类型像可以从JSON对象反序列化数组或列表)。 JsonObjectAttribute也可以添加到该类型迫使它从JSON对象反序列化。 路径 'GetDataRESTResult',第1行,第23位。

Answer 1:

Below code works

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

You can also use 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();


Answer 2:

{ “GetDataRESTResult”:[{ “KEY1”:100.0000, “密钥2”:1, “密钥3”: “最小”},{ “KEY1”:100.0000, “密钥2”:2 “密钥3”: “最大”}] }

你的数据是一个JSON对象(其中它有一个键“GetDataRESTResult”与JSON阵列的值)。 正因为如此,您应该反序列化为类型应该是一个目标,而不是一个集合。

DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(DataDC));
DataDC pricinglist = (DataDC)serializer.ReadObject(memStream);

如果你的类型DataDC像这样它会工作:

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


文章来源: Trying to deserialize JSON using JSON.NET and DataContractJsonSerializer fails