1

请帮助,我被卡住了。我有一个 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 对象(例如 {"name":"value"})反序列化为类型“System.Collections.Generic.List`1[MyApp.MyServiceReference.DataDC]”,因为该类型需要 JSON 数组(例如 [1, 2,3]) 正确反序列化。要修复此错误,要么将 JSON 更改为 JSON 数组(例如 [1,2,3]),要么将反序列化类型更改为普通的 .NET 类型(例如,不是像整数这样的原始类型,而不是像这样的集合类型可以从 JSON 对象反序列化的数组或列表。JsonObjectAttribute 也可以添加到类型中以强制它从 JSON 对象反序列化。路径“GetDataRESTResult”,第 1 行,位置 23。

4

2 回答 2

6

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

您的数据是一个 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; }
}
于 2012-10-03T04:05:11.663 回答
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();
于 2012-10-02T22:25:29.077 回答