21

I am trying to find a path of a JSON value. Consider the following JSON:

{
    "car": {
        "type": [{
            "sedan": {
                "make": "honda",
                "model": "civics"
            }
        },
        {
            "coupe": {
                "make": "ford",
                "model": "escort"
            }
        }]
    }
}

How can I get the path of the value "honda"? I'm looking to find something like this...

car_type_0_sedan_make_honda

Does JSON.NET support this? I see that there is a JToken.Path property but it is currently not available. http://json.codeplex.com/workitem/24136

0

4 Answers 4

32

You could also try the SelectToken method like this:

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

Outputs:

car.type[0].sedan.make -> honda
Sign up to request clarification or add additional context in comments.

1 Comment

I was looking for something like SelectToken because I thought an excellent library such as NewtonSoft.Json would have a nice feature like this :)
20

Update to the latest version of Json.NET. The Path property was added to JToken in version 5.0 release 1 (April 7, 2013).

Here is a test program you can use to verify that it works:

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());
    }
}

Output:

car.type[0].sedan.make -> honda

3 Comments

I just installed the dll from NuGet but Visual Studio properties says Version 4.5.0.0. But looking in ~/packages/Newtonsoft.Json.5.0.8/Lib/net45, the properties on the file says version 5.0.8.16617. Anyway, I get this error [Method not found: 'System.String Newtonsoft.Json.LinqJToken.get_Path()'.]
It works for me. I added a test program to my answer that I used to test it. Is your project somehow referencing an older version of Json.Net? Do you have an old version installed in your GAC? If you run the above code in a new project, does that work? The version numbers you cited look correct-- the latest version has a DLL version of 5.0.8.16617 and an assembly version of 4.5.0.0.
I just tried this again on another computer and it works! I think you're right, my first computer must be referencing an old version somehow. I'll dig into that issue later but thank you so much!
5

There is also a way to retrieve the path just by the value, using linq. You will need Json.NET for this.

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

        Console.WriteLine(token.Path);

See: https://dotnetfiddle.net/vZ1zLg

Comments

-4

you can Convert the Json to dynamic object as below.

JavaScriptSerializer js=new JavaScriptSerializer();
var dataObject=Json.Decode(jsonString);

Then you can reflect over it and find out your string "honda" and construct the path as you like.

2 Comments

How would you search for value within the dataObject you have above?
var is not dynamic. Its type is inferred in compile-time.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.