Добавить JObject в JArray на n-й позиции - PullRequest
0 голосов
/ 16 октября 2018

В настоящее время я работаю над ASP.NET Web API .NET Framework 4.7.2.Я пытаюсь изменить некоторые данные JSON в моем классе обслуживания.Я пытаюсь добавить новый объект после каждого второго объекта в моем JArray.

Я думал о манипулировании данными JSON, а не о конкретных объектах, потому что полученные данные, скорее всего, будут динамическими данными.Я использую библиотеку JObject, но получаю сообщение об ошибке без каких-либо реальных сообщений об исключениях.

Моя полученная структура JSON выглядит так:

{ "data" : [
   {"IsPlaceholder": 0, "Name" : "Test1", "Size" : 2 },
   {"IsPlaceholder": 0, "Name" : "Test2", "Size" : 3 },
   {"IsPlaceholder": 0, "Name" : "Test3", "Size" : 1 }
]}

Мой класс обслуживания выглядит так:

public class MyService : IMyService
{
    public async Task<JObject> UpdateInformationAsync(JObject coolData)
    {    
        // Random placeholder, new placeholder object after 2nd
        var placeholder = JObject.FromObject(new PlaceholderVm());
        var cnt = 0;

        foreach (JObject c in coolData["data"] as JArray)
        {
            if (cnt % 2 == 0)
            {
                coolData["data"][cnt].AddAfterSelf(placeholder);
            }
            cnt++;
        }

        return coolData;
    }
}

Моя модель представления заполнителя выглядит следующим образом:

public class PlaceholderVm
{
    public int IsPlaceholder => 1;
    public string Name => "Placeholder";
    public float Size { get; set; } = 0;
}

Когда я пытаюсь добавить заполнитель Vm в мой JArray, он отлично работает в первый раз, но на 2-й итерациивыдает сообщение об ошибке без исключения.

Знаете ли вы, как я могу добавить новый объект JO на n-й позиции в мой JArray?

Спасибо!

1 Ответ

0 голосов
/ 16 октября 2018

Это потому, что вы изменяете базовую коллекцию, проходя по ней в foreach.Это причина, по которой вы часто будете видеть, как люди инициализируют новый List<T> при выполнении подобных операций, чтобы избежать этой ошибки.

Это действительно выдает это исключение:

Выполнитьисключение времени (строка 21): коллекция была изменена;операция перечисления может не выполняться.

System.InvalidOperationException: Коллекция была изменена;Операция перечисления может не выполняться.

Самый простой способ - просто создать новую коллекцию и поместить вещи туда, куда вы хотите, чтобы они шли.В вашем случае это может выглядеть так:

    var jObject = new JObject();
    JArray jArray = new JArray();

     foreach (JObject c in coolData["data"] as JArray)
    {
         jArray.Add(c);

        if (cnt % 2 == 0)
        {
            jArray[jArray.Count - 1].AddAfterSelf(placeholder);
        }
        cnt++;
    }

    jObject.Add("data", jArray);

Вот .NET Fiddle

...