将 JObject 添加到 JArray 的第 n 个位置
Add JObject to JArray on nth position
我目前正在开发 ASP.NET Web API .NET Framework 4.7.2。我尝试更改服务 class 中的一些 JSON 数据。我尝试在我的 JArray 中的每个第二个对象之后添加一个新对象。
我考虑过操纵 JSON 数据,而不是具体对象,因为接收到的数据很可能是动态数据。我正在使用 JObject 库,但出现了一些错误,但没有任何真正的异常消息。
我收到的 JSON 结构如下所示:
{ "data" : [
{"IsPlaceholder": 0, "Name" : "Test1", "Size" : 2 },
{"IsPlaceholder": 0, "Name" : "Test2", "Size" : 3 },
{"IsPlaceholder": 0, "Name" : "Test3", "Size" : 1 }
]}
我的服务 class 看起来像这样:
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 时,它第一次工作正常,但在第二次迭代时它抛出了一个没有异常消息的错误。
您知道如何将新的 JObject 添加到我的 JArray 的第 n 个位置吗?
谢谢!
这是因为您在 foreach
中循环遍历它时正在改变底层 collection。这就是为什么您经常会看到人们在执行此类操作时初始化一个新的 List<T>
,以避免此错误。
它实际上产生了这个异常:
Run-time exception (line 21): Collection was modified; enumeration operation may not execute.
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
最简单的解决方法是简单地创建一个新的 collection 并将其放置在您希望放置的位置。在您的情况下,这可能看起来像:
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
我目前正在开发 ASP.NET Web API .NET Framework 4.7.2。我尝试更改服务 class 中的一些 JSON 数据。我尝试在我的 JArray 中的每个第二个对象之后添加一个新对象。
我考虑过操纵 JSON 数据,而不是具体对象,因为接收到的数据很可能是动态数据。我正在使用 JObject 库,但出现了一些错误,但没有任何真正的异常消息。
我收到的 JSON 结构如下所示:
{ "data" : [
{"IsPlaceholder": 0, "Name" : "Test1", "Size" : 2 },
{"IsPlaceholder": 0, "Name" : "Test2", "Size" : 3 },
{"IsPlaceholder": 0, "Name" : "Test3", "Size" : 1 }
]}
我的服务 class 看起来像这样:
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 时,它第一次工作正常,但在第二次迭代时它抛出了一个没有异常消息的错误。
您知道如何将新的 JObject 添加到我的 JArray 的第 n 个位置吗?
谢谢!
这是因为您在 foreach
中循环遍历它时正在改变底层 collection。这就是为什么您经常会看到人们在执行此类操作时初始化一个新的 List<T>
,以避免此错误。
它实际上产生了这个异常:
Run-time exception (line 21): Collection was modified; enumeration operation may not execute.
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
最简单的解决方法是简单地创建一个新的 collection 并将其放置在您希望放置的位置。在您的情况下,这可能看起来像:
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