我正在从数据集表创建动态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"
}
]
```
答案 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();
.....