Подтвердить что ты не робот

Доступ ко всем элементам в JTOKEN, json.net

У меня есть блок json:

{
    "ADDRESS_MAP":{

        "ADDRESS_LOCATION":{
            "type":"separator",
            "name":"Address",
            "value":"",
            "FieldID":40
        },
        "LOCATION":{
            "type":"locations",
            "name":"Location",
            "keyword":{
                "1":"LOCATION1"
            },
            "value":{
                "1":"United States"
            },
            "FieldID":41
        },
        "FLOOR_NUMBER":{
            "type":"number",
            "name":"Floor Number",
            "value":"0",
            "FieldID":55
        },
        "self":{
            "id":"2",
            "name":"Address Map"
        }
    }
}

Как я могу получить все ключевые элементы, которые включает этот токен. Например, из приведенного выше кода я хочу иметь "ADRESS_LOCATION", "LOCATION", "FLOOR_NUMBER" и "self".

Спасибо

4b9b3361

Ответ 1

Вы можете применить JToken к JObject, а затем использовать метод Properties(), чтобы получить список свойств объекта. Оттуда вы можете легко получить имена.

Что-то вроде этого:

string json =
@"{
    ""ADDRESS_MAP"":{

        ""ADDRESS_LOCATION"":{
            ""type"":""separator"",
            ""name"":""Address"",
            ""value"":"""",
            ""FieldID"":40
        },
        ""LOCATION"":{
            ""type"":""locations"",
            ""name"":""Location"",
            ""keyword"":{
                ""1"":""LOCATION1""
            },
            ""value"":{
                ""1"":""United States""
            },
            ""FieldID"":41
        },
        ""FLOOR_NUMBER"":{
            ""type"":""number"",
            ""name"":""Floor Number"",
            ""value"":""0"",
            ""FieldID"":55
        },
        ""self"":{
            ""id"":""2"",
            ""name"":""Address Map""
        }
    }
}";

JToken outer = JToken.Parse(json);
JObject inner = outer["ADDRESS_MAP"].Value<JObject>();

List<string> keys = inner.Properties().Select(p => p.Name).ToList();

foreach (string k in keys)
{
    Console.WriteLine(k);
}

Вывод:

ADDRESS_LOCATION
LOCATION
FLOOR_NUMBER
self

Ответ 2

В дополнение к принятому ответу я хотел бы дать ответ, который показывает, как итерации непосредственно над коллекциями Newtonsoft. Он использует меньше кода, и я предполагаю, что он более эффективен, поскольку он не предполагает конвертирование коллекций.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
//Parse the data
JObject my_obj = JsonConvert.DeserializeObject<JObject>(your_json);

foreach (KeyValuePair<string, JToken> sub_obj in (JObject)my_obj["ADDRESS_MAP"])
{
    Console.WriteLine(sub_obj.Key);
}

Я начал делать это сам, потому что JsonConvert автоматически десериализует вложенные объекты как JToken (которые, как я думаю, JObject, JValue или JArray).

Я думаю, что синтаксический анализ работает в соответствии со следующими принципами:

  • Каждый объект абстрагируется как JToken

  • Передача в JObject, где вы ожидаете словаря

  • Передача в JValue, если JToken представляет терминал node и представляет собой значение

  • Передать в JArray, если его массив

  • JValue.Value дает вам тип .NET, который вам нужен

Ответ 3

Если вы знаете структуру json, которую вы получаете, я бы предложил создать структуру классов, которая отражает то, что вы получаете в json.

Затем вы можете вызвать его что-то вроде этого...

AddressMap addressMap = JsonConvert.DeserializeObject<AddressMap>(json);

(Где json - строка, содержащая json)

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

просмотрите http://www.hanselman.com/blog/NuGetPackageOfTheWeek4DeserializingJSONWithJsonNET.aspx для получения дополнительной информации