Добавить JObject в JArray на n-й позиции
В настоящее время я работаю над 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;
}
Когда я пытаюсь добавить placeholderVm в мой JArray, он работает нормально с первого раза, но на 2-й итерации выдает сообщение об ошибке без исключения.
Знаете ли вы, как я могу добавить новый объект JO на n-й позиции в мой JArray?
Спасибо!
1 ответ
Это связано с тем, что вы изменяете основную коллекцию, перебирая ее в 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