【问题标题】:why is Jarray adding duplicate jobjects?为什么 Jarray 添加重复的作业?
【发布时间】:2019-04-24 08:21:46
【问题描述】:

我正在从数据集表创建一个动态 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);
}

当前结果:添加了重复的作业对象,并且它始终是 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"
}
]
```

【问题讨论】:

  • 因为你添加的是同一个对象
  • 您可以在每个循环中为 product_Price 创建一个新的 JObject,而不是总是删除内容。只需在第一个 for 循环中获取变量即可。
  • 为什么它有 +1 ......已经有无数类似的问题......回答这个问题只是为了“免费代表农业”
  • @Selvin,然后把它当作骗子关掉。

标签: c# arrays .net json.net


【解决方案1】:

您只有一个 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();
.....

【讨论】:

    【解决方案2】:

    正如 Leon 在 cmets 中提到的,您应该在循环中使用新的 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-10-02
      • 2017-01-22
      • 2021-05-15
      • 1970-01-01
      • 1970-01-01
      • 2013-06-04
      • 1970-01-01
      相关资源
      最近更新 更多