【问题标题】:Add JObject to JArray on nth position在第 n 个位置将 JObject 添加到 JArray
【发布时间】:2019-03-20 23:59:00
【问题描述】:

我目前正在开发 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 时,它第一次运行良好,但在第二次迭代时,它会抛出一个错误而没有异常消息。

你知道如何在我的 JArray 的第 n 个位置添加一个新的 JObject 吗?

谢谢!

【问题讨论】:

  • 看看thisthis可能对你有好处
  • 感谢您的提示!

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


【解决方案1】:

这是因为您在 foreach 中循环遍历底层集合时正在改变它。这就是您经常看到人们在执行此类操作时初始化一个新的List&lt;T&gt; 以避免此错误的原因。

它实际上产生了这个异常:

运行时异常(第 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

【讨论】:

  • 我的代码中有一个错误,AddAfterSelf 在错误的索引之后添加了它(我相信我编辑了我的答案以更正它)。对此感到抱歉
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 1970-01-01
  • 2021-12-18
  • 1970-01-01
相关资源
最近更新 更多