将新对象添加到JArray时,每个对象都会添加到数组中的第一个条目([0])并附加到数组中。
response = client.GetAsync(new Uri(urlIndexDoc)).Result;
result = response.Content.ReadAsStringAsync().Result;
JObject OPDDoc = JObject.Parse(result);
JArray indexCEM = new JArray();
JObject oNew = new JObject();
int idxcount = Convert.ToInt32(ConfigurationManager.AppSettings["IndexCount"]) + 1;
for (int i = 1; i < idxcount ; i++)
{
string istring = i.ToString();
var idxname = OPDDoc["IndexName_" + istring];
if (idxname != null)
{
oNew["PriceIndexId"] = istring;
oNew["IndexName"] = idxname;
oNew["IndexPrice"] = OPDDoc["IndexPrice_" + istring];
indexCEM.Add(oNew);
}
}
每次添加下一个对象时,我都可以看到它覆盖调试器中的第一个元素。结果是附加的最后一项最终在indexCEM [0]中,并且是最后一项。我在这里遗漏了什么或这是一个错误吗?
在控制台应用中使用VS 2013和Json.Net 5.08。
答案 0 :(得分:5)
问题是您在循环外创建oNew
JObject,然后重复使用该实例并在循环的每次迭代中将其重新添加到JArray。由于JArray具有对同一个JObject实例的多个引用,因此当您更改该实例时,它将反映在数组中的多个位置并不奇怪。
您需要做的是将oNew
的创建移到循环中,如下所示:
for (int i = 1; i < idxcount ; i++)
{
string istring = i.ToString();
var idxname = OPDDoc["IndexName_" + istring];
if (idxname != null)
{
JObject oNew = new JObject();
oNew["PriceIndexId"] = istring;
oNew["IndexName"] = idxname;
oNew["IndexPrice"] = OPDDoc["IndexPrice_" + istring];
indexCEM.Add(oNew);
}
}
然后在循环的每次迭代中创建一个新的JObject,您将不再覆盖您的值。