如何使用Linq和JSON从这个奇怪的JSON中获取所有ID?

时间:2017-03-30 20:20:40

标签: c# json linq

我从一个看起来像这样的网络服务收到JSON:

{
   "RESULTS": {
      "1220": {
           "DDR_TYPE_ID": 7,
           "DDR_ID": 5199,
           "DDR_NAME": "Mesa Building"
      },
      "5455": {
           "DDR_TYPE_ID": 7,
           "DDR_ID": 417,
           "DDR_NAME": "Scottsdale Building"
      },
      "1462": {
           "DDR_TYPE_ID": 12,
           "DDR_ID": 3324,
           "DDR_NAME": "Gentry Building"
      }
   }
}

我无法用我常用的方法进行序列化,因为这不是一个相同对象的数组,这要归功于奇数编号的键。

我需要的是DDR_ID值的列表。

有没有办法使用Linq to JSON从这个JSON中获取这些值?或者有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

"奇数编号的键" (或任何其他动态键)可以通过反序列化到字典来处理。所以,例如,如果你有这样一个类:

public class MyJSON
{
    public Dictionary<int,ResultItem> Results { get; set; }
}

public class ResultItem
{
    public int DDR_ID { get; set; }
}

然后,在反序列化之后,您应该能够通过以下方式获取您的身份:

var myObj = JsonConvert.DeserializeObject<MyJSON>(jsonString);   // using JSON.Net
var ids = myObj.Results.Select(p => p.Value.DDR_ID);

这里是fiddle

答案 1 :(得分:2)

如果您想避免使用其他对象:

using System;
using System.Linq;
using Newtonsoft.Json.Linq;

var jObject = JObject.Parse(json)["RESULTS"]; 
var result = jObject.Select(x => x.First["DDR_ID"]).Values<int>();

答案 2 :(得分:1)

  

有没有办法使用Linq to JSON从中获取这些值   JSON?

使用Linq to JSON,你可以获得这样的值而不需要其他对象

var obj = (JObject) JObject.Parse(json)["RESULTS"];
var ids = obj.Properties().Select(p => (int)p.Value["DDR_ID"]);