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

时间:2012-10-02 22:21:11

标签: c# .net json json.net datacontractserializer

帮忙,我被困了。 我有一个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我得到另一个例外,但我仍然无法弄明白,有人可以帮忙吗?

EDIT   这是一个JSON.NET堆栈跟踪:

  

无法反序列化当前的JSON对象(例如{“name”:“value”})   进入类型   'System.Collections.Generic.List`1 [MyApp.MyServiceReference.DataDC]'   因为该类型需要一个JSON数组(例如[1,2,3])来反序列化   正确。要修复此错误,请将JSON更改为JSON数组   (例如[1,2,3])或更改反序列化类型以使其正常   .NET类型(例如,不是整数的基本类型,不是集合   类似于数组或List的类型,可以从JSON反序列化   宾语。 JsonObjectAttribute也可以添加到类型中以强制它   从JSON对象反序列化。路径'GetDataRESTResult',第1行,   第23位。

2 个答案:

答案 0 :(得分:6)

  

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

答案 1 :(得分:3)

代码下方

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