#c# #json.net
Вопрос:
Я получаю массив элементов из веб-API (строки перед этим опущены):
var cars = JArray.Parse(response.Content.ReadAsStringAsync().Result)
Внутри автомобилей Джаррей это выглядит так:
"cars": [{
"id": 1,
"make": "Audi",
"color": "red"
}, {
"id": 2,
"make": "Mercedes",
"color": "red"
}, {
"id": 3,
"make": "Ford",
"color": "yellow"
}]
Я хотел бы обновить цвет Ford до красного, если Audi тоже красная.
Как я могу это сделать с помощью C# и Json.NET?
Комментарии:
1. Вы можете использовать путь json вместе с токеном json
2. eeek не работает
.Result
асинхронно. Рецепт катастрофы.
Ответ №1:
Предоставленный вами JSON недопустим для моего анализа, поэтому я сделал предположение, чтобы продемонстрировать. который заключает ваш образец в корневой объект JSON.
Вы можете запросить объект задания с помощью keys
. т. е. для доступа cars
к свойствам в JSON, который вы можете использовать o["cars"]
. При таком подходе вы можете видеть, что я использую немного Linq, чтобы выяснить, является ли Audi красным, и если да, вы можете выполнить прямые изменения o
объекта и установить соответствующие значения.
Это самый простой подход, без какого-либо дополнительного кода.
void Main()
{
var json = @"
{
""cars"": [
{ ""id"": 1, ""make"": ""Audi"", ""color"": ""red"" },
{ ""id"": 2, ""make"": ""Mercedes"", ""color"": ""red"" },
{ ""id"": 3, ""make"": ""Ford"", ""color"": ""yellow"" }
]
}";
var jObject = Newtonsoft.Json.Linq.JObject.Parse(json);
var jArray = jObject["cars"] as JArray;
Console.WriteLine("Before: " JsonConvert.SerializeObject(jObject));
var audiIsRed = jArray.Any(car => car.Value<string>("make").Equals("Audi") amp;amp; car.Value<string>("color").Equals("red"));
if (audiIsRed)
{
jArray.First(c => c.Value<string>("make").Equals("Ford"))["color"] = "red";
}
Console.WriteLine("After: " JsonConvert.SerializeObject(jObject));
}
Альтернативой может быть создание POCO для десериализации результатов, которые будут содержать, например, a List<Car>
, а затем вы сможете выполнить все изменения с помощью C# и без JSON.NET затем сериализуйте этот результат обратно в JSON.