将对象添加到JArray覆盖第一个元素

时间:2014-01-15 18:04:55

标签: json.net

将新对象添加到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。

1 个答案:

答案 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,您将不再覆盖您的值。