为什么Jarray添加重复的Jobject?

时间:2019-04-24 08:21:46

标签: c# arrays .net json.net

我正在从数据集表创建动态Jobject。该对象应具有3个键/值对的集合。

{
    "Lowest": "12.50",
    "Highest": "",
    "Type": "normal"
}

我正在遍历一个表以生成对象的数组 代码

dynamic product_Price = new JObject();
JArray product_Price_array = new JArray();

for (int i = 0; i <= ds.Tables[0].Rows.Count-1; i++)
{
   product_Price.RemoveAll();
   // this is loop through columns to generate the dynamic key value  pair of 
   the object 
   for (int j = 0; j < ds.Tables[0].Columns.Count; j++)
   {


   product_Price.Add(ds.Tables[0].Columns[j].ColumnName,ds.Tables[0].Rows[i] 
   [j].ToString());


    }
 // now that i have object end of the loop i am adding to the array. but here its always duplicate of object not unique                     
 product_Price_array.Add(product_Price);
}

当前结果:添加了重复的jobject,并且它始终是ds.Tables [0]循环中的最后一个条目

[
{
    "Lowest": "17.50",
    "Highest": "",
    "Type": "kid"
},

{
    "Lowest": "17.50",
    "Highest": "",
    "Type": "kid"
}
]

我已经尝试过使用list,静态对象而不是动态对象。

预期结果

[
{
    "Lowest": "12.50",
    "Highest": "",
    "Type": "normal"
},

{
    "Lowest": "17.50",
    "Highest": "",
    "Type": "kid"
}
]
```

2 个答案:

答案 0 :(得分:0)

正如Leon在评论中提到的那样,您应该在循环中使用新的JObject,而不要使用数组引用。

为什么您的代码要添加相同的值(实际上是对象):

在创建对象时会为其分配内存位置:

dynamic product_Price = new JObject();

将对象添加到数组时,将存储地址的引用

product_Price_array.Add(product_Price);

清除它,然后在product_Price中添加新值,将删除其中的值,并添加新值,但是原始位置未更改,因此您添加到product_Price_array的所有对象都指向同一地址(也是同一个对象。

product_Price.RemoveAll();

如果改为RemoveAll,则只需创建一个新的JObject,这将在另一个地址处创建一个新的product_Price对象,然后将其添加到数组的末尾。

product_Price = new JObject();

我建议您看看how arrays work

此外,不确定为什么要使用Dynamic对象,为什么不只使用JObject

答案 1 :(得分:0)

您只有一个JObject实例product_Price。在外循环的第一圈中,您设置product_Price的值,并将对product_Price的引用添加到product_Price_array

在外循环的第二次行程中,您清除了product_Price的内容,这也清除了product_Price_array的第一个元素的内容,因为它是相同的对象实例。然后,用第二组数据填充它,该数据也填充product_Price_array的第一个元素,然后在product_Price中添加对product_Price_array的第二个引用。

就像@Selvin和@Leon所说的,每次都只需创建一个新的JObject,例如

for (int i = 0; i <= ds.Tables[0].Rows.Count-1; i++)
{
   dynamic product_Price = new JObject();
.....