【问题标题】:Parsing child json elements jarray c#解析子json元素jarray c#
【发布时间】:2017-08-18 22:07:19
【问题描述】:

我正在使用 json.net jarray 并尝试在 c# 中解析以下内容,但无法弄清楚如何获取子值,即城市。另外,我将需要搜索它们,请您帮忙,或者指向另一个链接,我搜索过,但没有看到类似的东西。

[
  {
    "name": "Test One",
    "address": [
      {
        "street": "123",
        "city": "chicago"
      },
      {
        "street": "456",
        "city": "New York"
      }
    ]

  },
  {
   "name": "Test Two",
    "address": [
      {
        "street": "567",
        "city": "Houston"
      },
      {
        "street": "987",
        "city": "Seattle"
      }
    ]
}
]

【问题讨论】:

标签: c# json


【解决方案1】:

示例解析代码:

string s = "[ { \"name\": \"Test One\", \"address\": [ { \"street\": \"123\", \"city\": \"chicago\" },"
    + " { \"street\": \"456\", \"city\": \"New York\" } ]}, "
    + "{ \"name\": \"Test Two\", \"address\": [ { \"street\": \"567\", \"city\": \"Houston\" },"
    + " { \"street\": \"987\", \"city\": \"Seattle\" } ] } ]";
var array = JArray.Parse(s);
for (int i = 0; i < array.Count; i++)
{
    var obj = array[i];
    var name = obj.Value<string>("name");
    Console.WriteLine($"Name: {name}");
    var addressArray = (JArray)obj["address"];
    for (int j = 0; j < addressArray.Count; j++)
    {
        var addressObj = addressArray[j];
        var street = addressObj.Value<string>("street");
        var city = addressObj.Value<string>("city");
        Console.WriteLine($"Street: {street}  City: {city}");
    }
}

输出:

Name: Test One
Street: 123  City: chicago
Street: 456  City: New York
Name: Test Two
Street: 567  City: Houston
Street: 987  City: Seattle

【讨论】:

    【解决方案2】:

    只需声明下面的类(参见http://json2csharp.com/ 如何生成它们)

    public class jaykzoo
    {
        public class Address
        {
            public string street { get; set; }
            public string city { get; set; }
        }
    
        public class RootObject
        {
            public string name { get; set; }
            public List<Address> address { get; set; }
        }
    }
    

    并调用JsonConvert.DeserializeObject

    var results = JsonConvert.DeserializeObject<List<jaykzoo.RootObject>>(jsonx);
    

    Tada,神奇的是你所有的数据都准备好了..

    【讨论】:

      【解决方案3】:

      有不同的方法来实现它。最常见和最干净的方法是 3 号。

      var jsonString = @"[ { ""name"": ""Test One"", ""address"": [ { ""street"": ""123"", ""city"": ""chicago"" }, { ""street"": ""456"", ""city"": ""New York"" } ]},
                          { ""name"": ""Test Two"", ""address"": [ { ""street"": ""567"", ""city"": ""Houston"" }, { ""street"": ""987"", ""city"": ""Seattle"" } ] } ]";
      
      var jarray = JArray.Parse(jsonString);
      
      // 1.) accessing via index
      Console.WriteLine(jarray[0]["address"][0]["city"]);
      
      // 2.) accessing via JObject & key
      foreach (var jobj in jarray.OfType<JObject>())
      {
          foreach (var address in jobj["address"])
          {
              Console.WriteLine(address.Value<string>("city"));
          }
      
      }
      
      // 3.) accessing via Parsed Class & search 
      var array = JsonConvert.DeserializeObject<List<Person>>(jsonString);
      var personLivingInHouston = array.First(p => p.Address.Any(a => a.City == "Houston"));
      Console.WriteLine(personLivingInHouston.Name);
      
      // 4.) accessing via dynamic & search
      var dynamicArray = JsonConvert.DeserializeObject<List<dynamic>>(jsonString);
      var personLivingInChicaco = dynamicArray.Find(p => p.address[0].city == "chicago");
      Console.WriteLine(personLivingInChicaco.name.ToString()); //watch the lowercase property here, because dynamic is treated as JObject (expandoObject)
      

      人物类:

      public class Person
      {
          public string Name { get; set; }
          public List<Address> Address = new List<Address>();
      }
      
      public class Address
      {
          public string City { get; set; }
          public string Street { get; set; }
      }
      

      【讨论】:

        猜你喜欢
        • 2023-04-01
        • 1970-01-01
        • 1970-01-01
        • 2014-10-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-01-29
        相关资源
        最近更新 更多