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

use*_*714 1 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);
            }
       }
Run Code Online (Sandbox Code Playgroud)

每次添加下一个对象时,我都可以看到它覆盖调试器中的第一个元素.结果是附加的最后一项最终在indexCEM [0]中,并且是最后一项.我在这里遗漏了什么或这是一个错误吗?

在控制台应用程序中使用VS 2013和Json.Net 5.08.

Bri*_*ers 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后在循环的每次迭代中创建一个新的JObject,您将不再覆盖您的值.