在第n个位置将JObject添加到JArray

时间:2018-10-16 12:39:25

标签: c# json asp.net-web-api json.net jobjectformatter

我目前正在使用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;
}

当我尝试向我的JArray中添加一个placeholderVm时,它第一次运行良好,但是在第二次迭代中,它抛出一个错误而没有异常消息。

您知道如何将第n个位置的新JObject添加到我的JArray吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

这是因为您在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