使用Newtonsoft.JSON的JsonPath

时间:2017-04-17 19:43:26

标签: json json.net jsonpath

我尝试了近一个小时的不同方法,但我没有得到它;(

我的JSON对象是:

"typeOfHair": {
    "value": [
        {
            "code": "Dry Hair",
            "values": [
                {
                    "value": "DryHair",
                    "language": "en"
                },
                {
                    "value": "TrockenesHaar",
                    "language": "de"
                }
            ]
        },
        {
            "code": "Any Type of Hair",
            "values": [
                {
                    "value": "AnyTypeOfHair",
                    "language": "en"
                },
                {
                    "value": "JedenHaartyp",
                    "language": "de"
                }
            ]
        }
    ]
}

我的任务是使用Newtonsoft.JSON获取语言所在的所有值" de"。 我目前的做法是:

JsonObject.SelectTokens("typeOfHair.value.values[?(@.language == 'de')].value").ToList()

有人可以帮我这个吗?

亲切的问候

2 个答案:

答案 0 :(得分:4)

你非常接近。您需要使用JsonPATH通配符运算符value来考虑外部typeOfHair.value[]数组[*]

var values = JsonObject.SelectTokens("typeOfHair.value[*].values[?(@.language == 'de')].value")
    // Convert from JValue to string
    .Select(v => (string)v)
    // Save in a list
    .ToList();

结果是:

["TrockenesHaar","JedenHaartyp"]

示例fiddle

答案 1 :(得分:-1)

我知道OP明确指定了JSONPath,但为了完整起见,下面是如何使用LINQ to JSON实现相同的目标:

var values = jObject["typeOfHair"]["value"]
    .SelectMany(v => v["values"])
    .Where(v => (string)v["language"] == "de")
    .Select(v => (string)v["value"])
    .ToList();

演示:https://dotnetfiddle.net/1S4sT4