使用JSON.NET获取JSON值的路径

duy*_*yen 12 c# json json.net

我试图找到一个JSON值的路径.考虑以下JSON:

{
    "car": {
        "type": [{
            "sedan": {
                "make": "honda",
                "model": "civics"
            }
        },
        {
            "coupe": {
                "make": "ford",
                "model": "escort"
            }
        }]
    }
}
Run Code Online (Sandbox Code Playgroud)

我怎样才能获得价值"本田"的路径?我想找到这样的东西......

car_type_0_sedan_make_ honda

JSON.NET是否支持此功能?我看到有一个JToken.Path属性,但它目前不可用.http://json.codeplex.com/workitem/24136

Bri*_*ers 17

更新到最新版本的Json.NET.的Path属性被添加到JToken版本5.0第1版(2013年4月7日).

这是一个测试程序,您可以用它来验证它的工作原理:

class Program
{
    static void Main(string[] args)
    {
        string json = @"
        {
            ""car"": {
                ""type"": [{
                    ""sedan"": {
                        ""make"": ""honda"",
                        ""model"": ""civics""
                    }
                },
                {
                    ""coupe"": {
                        ""make"": ""ford"",
                        ""model"": ""escort""
                    }
                }]
            }
        }";

        JObject obj = JObject.Parse(json);
        JToken token = obj["car"]["type"][0]["sedan"]["make"];
        Console.WriteLine(token.Path + " -> " + token.ToString());
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

car.type[0].sedan.make -> honda
Run Code Online (Sandbox Code Playgroud)


Col*_*ame 16

您也可以尝试这样的SelectToken方法:

var j = JObject.Parse(json);
var value = j.SelectToken("car.type[0].sedan.make");
Console.WriteLine(token.Path + " -> " + token.ToString());
Run Code Online (Sandbox Code Playgroud)

输出:

car.type[0].sedan.make -> honda
Run Code Online (Sandbox Code Playgroud)

  • 我一直在寻找诸如SelectToken之类的东西,因为我认为像NewtonSoft.Json这样的优秀库将具有这样的好功能:) (2认同)

小智 5

还有一种方法可以使用 linq 仅通过值检索路径。为此,您将需要 Json.NET。

JObject jo = JObject.Parse(json);
var token = jo.Descendants()
                    .OfType<JProperty>()
                    .Where(p => p.Value.ToString() == "honda")
                    .First();

        Console.WriteLine(token.Path);
Run Code Online (Sandbox Code Playgroud)

请参阅:https : //dotnetfiddle.net/vZ1zLg