簡體   English   中英

如何在c#中獲得嵌套的JSON值?

[英]How do I get nested JSON values in c#?

我從服務返回以下JSon字符串:

{
    "links": {
        "data": {
            "self": {
                "body": "",
                "content_type": "",
                "href": "",
                "method": "GET",
                "name": ""
            }
        }
    },
    "results": [{
        "data": {
            "categories": {
                "41370_10": "abc",
                "41370_11": "abc",
                "41370_2": "abc",
                "41370_5": "abc"
            }
        },
        "metadata": {
            "categories": {
                "41370": {
                    "key": "41370",
                    "name": "123"
                },
                "41370_10": {
                    "bulk_shared": false,
                    "key": "41370_10",
                    "name": "some name"
                },
                "41370_11": {
                    "allow_undefined": false,
                    "key": "41370_11",
                    "name": "some name 2"
                },
                "41370_2": {
                    "key": "41370_2",
                    "key_value_pairs": false,
                    "name": "some name 3"
                }
            }
        }
    },
    {
        "data": {
            "categories": {
                "72051_2": "asd",
                "72051_3": "asd"
            }
        },
        "metadata": {
            "categories": {
                "72051": {
                    "key": "72051",
                    "name": "some name 4"
                },
                "72051_2": {
                    "key": "72051_2",
                    "name": "some name 5"
                }
            }
        }
    },
    {
        "data": {
            "categories": {
                "112644_2": "zxc"
            }
        },
        "metadata": {
            "categories": {
                "112644": {
                    "key": "112644",
                    "name": "some name 6"
                },
                "112644_2": {
                    "hidden": false,
                    "key": "112644_2",
                    "name": "some name 7"
                }
            }
        }
    }]
}

如何處理這些數據以獲得一個漂亮,簡單的字典? 它看起來像這樣:

{"some name", "abc"}, 
{"some name 2", "abc"}, 
{"some name 3", "abc"},
{"some name 5", "asd"},
{"some name 6", "zxc"}

目前正在嘗試使用c#,json.net,但收效甚微。 任何幫助非常感謝。

更新1:我已經得到了JTokens的功能,但我不確定如何將數據與元數據分開(是的,我意識到這聽起來多么荒謬)。

//get json object
JObject cjob = JObject.Parse(response.Content.ReadAsStringAsync().Result);

IEnumerable<JToken> categorymetadata = cjob.Descendants()
    .Where(t => t.Type == JTokenType.Property && ((JProperty)t).Name == "categories")
    .SelectMany(p => ((JProperty)p).Value);

以下LINQ-to-JSON查詢應該為您提供所需的結果:

Dictionary<string, string> dict = cjob["results"]
    .Children<JObject>()
    .Select(result => result.SelectToken("metadata.categories").Children<JProperty>()
                            .Join(result.SelectToken("data.categories").Children<JProperty>(),
                                  metaCat => metaCat.Name,
                                  dataCat => dataCat.Name,
                                  (metaCat, dataCat) => new
                                  {
                                      Name = (string)metaCat.Value["name"],
                                      Value = (string)dataCat.Value
                                  }
                            )
    )
    .SelectMany(a => a)
    .ToDictionary(a => a.Name, a => a.Value);

foreach (var kvp in dict)
{
    Console.WriteLine(kvp.Key + ": " + kvp.Value);
}

這會在metadata對象中的類別與每個結果的data對象中的類別之間進行內部聯接,並將聯接的屬性選擇為匿名名稱 - 值對的列表(實際上是IEnumerable)。 然后將對列表展平為單個列表,最后放入字典中。

我對您的數據做出以下假設:

  • 每個結果對象將始終具有元數據和數據
  • 類別名稱和數據值將始終為字符串
  • 所有結果中的類別名稱都是唯一的

如果這些假設不成立,您將遇到錯誤並需要對代碼進行調整。

這是一個工作演示: https//dotnetfiddle.net/WkztV5

我建議使用JsonConvert.DeserializeObject,你可以將你的json反序列化為對象,然后用這些對象做你想做的事情,例如:

public class Account
{
    public string Email { get; set; }
    public bool Active { get; set; }
    public DateTime CreatedDate { get; set; }
    public IList<string> Roles { get; set; }
}

string json = @"{
'Email': 'james@example.com',
'Active': true,
'CreatedDate': '2013-01-20T00:00:00Z',
'Roles': [
'User',
'Admin']
}";

Account account = JsonConvert.DeserializeObject<Account>(json);

Console.WriteLine(account.Email);
// james@example.com

https://www.newtonsoft.com/json/help/html/DeserializeObject.html

如果你想把你的json轉換成對象而不想出來: http//json2csharp.com/是一個非常漂亮的工具,只需復制並將你的json復制到那里。

在你的情況下,你將有一個這樣的根對象:

public class RootObject
{
    public Links links { get; set; }
    public List<Result> results { get; set; }
}

並且您可以查看結果以獲得您想要的結果。

我認為這樣做很容易,但我在JSON層次結構中只有幾個級別

dynamic deserialized = JsonConvert.DeserializeObject((string)data);
newObj = deserialized["objName"].value == null ? "" : deserialized["objName"].value;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM