Получить путь к значению JSON, используя JSON.NET

Я пытаюсь найти путь к значению JSON. Рассмотрим следующий JSON:

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

Как я могу получить путь значения "honda"? Я ищу что-то вроде этого...

car_type_0_sedan_make_Хонда

делает JSON.NET поддержать это? Я вижу, что есть JToken.Путь свойство, но в настоящее время оно недоступно. http://json.codeplex.com/workitem/24136

4 ответов


обновление последняя версия of Json.NET - ... The Path свойство JToken на версии 5.0 1 (7 апреля 2013).

вот тестовая программа, которую вы можете использовать, чтобы убедиться, что она работает:

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

выход:

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

вы также можете попробовать SelectToken способ такой:

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

выходы:

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

существует также способ получить путь только по значению, используя 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);

см.:https://dotnetfiddle.net/vZ1zLg


вы можете преобразовать Json в динамический объект, как показано ниже.

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

затем вы можете поразмыслить над ним и узнать свою строку "honda" и построить путь, как вам нравится.