如何使用对象反序列化对象的值

时间:2016-05-19 12:43:23

标签: c# json json.net

我在泡菜中。我找不到如何反序化这个json。我在网上找到的所有内容都谈到了如何处理键值/值,其中值是类型而不是对象。在这种情况下,值是一个内部具有附加键/值的对象。

此外,你在“领地”之后看到的像长串的长指针是不一样的......

如何使用JSON.NET反序列化?我希望能够获得ID和名称。

感谢您阅读本文

{
  "territories":{
    "6368e494-c47c-4678-89de-45f3bfc35247":{
      "id":"6368e494-c47c-4678-89de-45f3bfc35247",
      "name":"Atlanta Camera Operations",
      "center":[
        33748995,
        -84387983
      ],
      "timeZoneCode":"America/New_York",
      "languageCode":"en"
    },
    "4d998d4c-fcc6-4fdc-9e73-3f2e7515ee47":{
      "id":"4d998d4c-fcc6-4fdc-9e73-3f2e7515ee47",
      "name":"Atlanta Operations",
      "center":[
        33748995,
        -84387983
      ],
      "timeZoneCode":"America/New_York",
      "languageCode":"en"
    }
  }
}

2 个答案:

答案 0 :(得分:3)

这是一个包含区域信息的课程:

class Territory
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("center")]
    public IList<int> Center { get; set; }

    [JsonProperty("timeZoneCode")]
    public string TimeZoneCode { get; set; }

    [JsonProperty("languageCode")]
    public string LanguageCode { get; set; }
}

然后你可以像这样逐个反序列化它们:

string myJsonText = "your json here";

var jsonObject = JObject.Parse(myJsonText);
var territoriesToken = jsonObject["territories"];

我们遍历孩子并反序列化:

var territoriesList = new List<Territory>();
foreach (var child in territoriesToken.Children())
{
    var territory = child.First.ToObject<Territory>();
    territoriesList.Add(territory);
}

或者如果你更喜欢LINQ one liners,你可以使用它:

var territoriesList = territoriesToken.Children()
                      .Select(child => child.First.ToObject<Territory>())
                      .ToList();

然后,您可以像使用任何其他C#对象一样访问名称和ID

territoriesList[0].Id
territoriesList[0].Name

答案 1 :(得分:-1)

你的json数据结构无效,它应该是这样的:

{
"territories": 
[
    {
        "id": "6368e494-c47c-4678-89de-45f3bfc35247",
        "name": "Atlanta Camera Operations",
        "center": [
            33748995, -84387983
        ],
        "timeZoneCode": "America/New_York",
        "languageCode": "en"
       }
       ,
       {
        "id": "4d998d4c-fcc6-4fdc-9e73-3f2e7515ee47",
        "name": "Atlanta Operations",
        "center": [
            33748995, -84387983
        ],
        "timeZoneCode": "America/New_York",
        "languageCode": "en"
    }
]

}

你可以映射到Territory类,意思是:

    public class Territory
{
    public GUID id { get; set; }
    public string name { get; set; }
    public List<int> center { get; set; }
    public string timeZoneCode { get; set; }
    public string languageCode { get; set; }
}

并使用:

反序列化
JsonConvert.DeserializeObject<List<Territory>>(your_json)