Как обновить значения JArray с помощью C# и Json.NET

#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.