Как вы анализируете массив объектов с помощью Newtonsoft?

Я просто хочу превратить этот JSON в какой-то объект. JArray и JToken меня совершенно сбивают с толку.

Я могу создать класс, чтобы Newtonsoft знал, на что сопоставлять, но если вы заметите, что объекты имеют структуру: { "anAnimal": { foo: 1, bar: 2 }} и idk, как будет выглядеть этот объект сопоставления. Я почти уверен, что это должно работать мгновенно, без каких-либо мыслей с моей стороны.

var myFavoriteAnimalsJson = @"
[
    {
        ""Dog"": {
            ""cuteness"": ""7.123"",
            ""usefulness"": ""5.2"",
        }
    },
    {
        ""Cat"": {
            ""cuteness"": ""8.3"",
            ""usefulness"": ""0"",
        }
    }
]";

var jArray = new JArray(myFavoriteAnimalsJson);
// grab the dog object. or the cat object. HOW CUTE IS THE DOG? 

Всегда ли объект Dog будет первым в массиве, или вам нужно определить, какой именно?

gunr2171 18.05.2022 04:45

Вы контролируете схему этого JSON? Если это так, вы можете упростить его. В вашем массиве есть список объектов, у которых есть свойство Dog или Cat, для которых эти свойства сами себя являются объектами. Может быть проще переместить все «на один уровень вверх».

gunr2171 18.05.2022 04:48

нет, иногда это будет собака. иногда это будет косатка. нет, я не контролирую это. Я мог бы легко получить это с помощью node.js и проанализировать его во что-то более простое для С#, но это слишком много. как только это сработает, будет намного лучше.

user875234 18.05.2022 04:52
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
3
32
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Если вы начинаете с сериализованного JSON, т.е. строки, вам нужно ее проанализировать:

var jArray = JArray.Parse(myFavoriteAnimalsJson);

хорошо, это работает, но тогда он дает мне JToken. ненавижу спрашивать, но... как можно прочитать информацию из JToken? Например, как я узнаю, есть ли у меня JToken Dog или Cat?

user875234 18.05.2022 04:54

Здесь есть несколько документов об этой библиотеке: newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm Идея заключается в том, чтобы преобразовать структуру JSON в дерево узлов, чтобы ее можно было легко перемещать и манипулировать. В прошлом я часто использовал этот способ управления JSON, хотя это довольно дорого с точки зрения использования памяти.

Mario Vernari 18.05.2022 05:03

С .SelectToken() для построения логики запроса пути JSON.

В приведенном ниже примере запрашивается первый элемент animals, чтобы получить объект токена «Собака» и его значение.

using Newtonsoft.Json;
using Newtonsoft.Json.Linq;

JArray animals = JArray.Parse(myFavoriteAnimalsJson);
        
var dog = animals[0].SelectToken("Dog");

Console.WriteLine(dog);
Console.WriteLine(dog["cuteness"]);

Образец программы

Выход

{ "cuteness": "7.123", "usefulness": "5.2" }

7.123

Просто примечание: это предполагает, что Dog всегда является первым элементом. Вы можете передать более сложный JSONPath в SelectToken, если он не находится в первом элементе. animals.SelectToken("$[*].Dog");

gunr2171 18.05.2022 05:00

Привет @gunr2171, хорошие подсказки и объяснение сценария! Спасибо за руководство. знак равно

Yong Shun 18.05.2022 05:04

Да, и что касается получения идентификатора каждого объекта (кошка, собака), я нашел этот код, который работает. javaer101.com/en/article/8638748.htmlvar jArray = JArray.Parse(myFavoriteAnimalsJson); var animals = jArray.Children<JObject>(); foreach(var animal in animals) { foreach(JProperty prop in animal.Properties()) { Console.WriteLine(prop.Name); } } Как устроена стандартная библиотека C# JSON. Чистое дерьмо UI IMO.

user875234 18.05.2022 05:21
Ответ принят как подходящий

Вы можете десериализовать его в List<Dictionary<string, AnimalData>>

class AnimalData
{
    public decimal cuteness;
    public decimal usefulness;
}
var myFavoriteAnimalsJson = @"
[
    {
        ""Dog"": {
            ""cuteness"": ""7.123"",
            ""usefulness"": ""5.2"",
        }
    },
    {
        ""Cat"": {
            ""cuteness"": ""8.3"",
            ""usefulness"": ""0"",
        }
    }
]";

var results = JsonConvert.DeserializeObject<List<Dictionary<string, AnimalData>>>(myFavoriteAnimalsJson);

Теперь каждый элемент списка содержит словарь с одним ключом DogCat...

Ницца! Это на самом деле то, что я пытался сделать. У меня был Dictionary<string, animal>, но не List.

user875234 18.05.2022 05:27

Другие вопросы по теме