У меня есть JSON, как показано ниже. Я хотел бы получить от него все объекты, где «тип» - «Элемент».
string json = @"
{
'name': 'Object 1',
'content': {
'body': {
'id': 'body',
'type': 'Body'
},
'style': {
'id': 'style',
'type': 'Style'
},
'DynamicName-123': {
'id': 'DynamicName-123',
'type': 'Row'
},
'DynamicName-434': {
'id': 'DynamicName-434',
'type': 'Column'
},
'DynamicName-223': {
'id': 'DynamicName-223',
'type': 'Item'
}
}
}";
JObject obj = JObject.Parse(json);
Ожидаемый результат:
'id': 'DynamicName-223',
'type': 'Item'
Как я могу это сделать?
Вы можете десериализовать анонимный тип со словарем внутри:
var template = new {name = "", content = new Dictionary<string, JObject>()};
var result = JsonConvert.DeserializeAnonymousType(json, template);
Теперь вы можете получить всю информацию из вложенных элементов:
foreach (var item in result.content)
Console.WriteLine($"{item.Key}: id = {item.Value["id"]}, type = {item.Value["type"]}");
Вывод будет:
body: id = body, type = Body
style: id = style, type = Style
DynamicName-123: id = DynamicName-123, type = Row
DynamicName-434: id = DynamicName-434, type = Column
DynamicName-223: id = DynamicName-223, type = Item
Вы можете получить объекты, которые имеют значение свойства «тип» «Элемент», используя запрос LINQ-to-JSON следующим образом:
JObject obj = JObject.Parse(json);
List<JObject> items = obj["content"]
.Children<JProperty>()
.Where(p => (string)p.Value["type"] == "Item")
.Select(p => (JObject)p.Value)
.ToList();
Рабочий пример: https://dotnetfiddle.net/dy1nQC
Привет, спасибо за то, что я видел некоторые сообщения, которые вы сделали в других темах, у вас есть отличные знания в JSON.net! Могу я задать вам еще вопрос. У меня есть свойство объекта столбца с именем parentId, которое содержит идентификатор объекта строки. Как известно, в строке может быть несколько столбцов. Как можно вернуть строку и все столбцы, связанные с этим идентификатором строки, чтобы я мог сохранить отношения родитель/потомок?
@Mask-dCodex -- Алекс Андреев только что ответил на этот вопрос здесь.
Брайан, ты можешь что-то посоветовать?
Спасибо за комментарий. Я знаю, что есть быстрые способы его фильтрации, однако я хочу расширить свой метод фильтрации, чтобы добиться этого :). Я десериализовал это так: JObject obj= JObject.Parse(json);