Я просто хочу превратить этот 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?
Вы контролируете схему этого JSON? Если это так, вы можете упростить его. В вашем массиве есть список объектов, у которых есть свойство Dog или Cat, для которых эти свойства сами себя являются объектами. Может быть проще переместить все «на один уровень вверх».
нет, иногда это будет собака. иногда это будет косатка. нет, я не контролирую это. Я мог бы легко получить это с помощью node.js и проанализировать его во что-то более простое для С#, но это слишком много. как только это сработает, будет намного лучше.
Если вы начинаете с сериализованного JSON, т.е. строки, вам нужно ее проанализировать:
var jArray = JArray.Parse(myFavoriteAnimalsJson);
хорошо, это работает, но тогда он дает мне JToken. ненавижу спрашивать, но... как можно прочитать информацию из JToken? Например, как я узнаю, есть ли у меня JToken Dog или Cat?
Здесь есть несколько документов об этой библиотеке: newtonsoft.com/json/help/html/QueryingLINQtoJSON.htm Идея заключается в том, чтобы преобразовать структуру JSON в дерево узлов, чтобы ее можно было легко перемещать и манипулировать. В прошлом я часто использовал этот способ управления JSON, хотя это довольно дорого с точки зрения использования памяти.
С .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, хорошие подсказки и объяснение сценария! Спасибо за руководство. знак равно
Да, и что касается получения идентификатора каждого объекта (кошка, собака), я нашел этот код, который работает. 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.
Вы можете десериализовать его в 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);
Теперь каждый элемент списка содержит словарь с одним ключом Dog
Cat
...
Ницца! Это на самом деле то, что я пытался сделать. У меня был Dictionary<string, animal>, но не List.
Всегда ли объект Dog будет первым в массиве, или вам нужно определить, какой именно?