【问题标题】:Convert Database data into JSON将数据库数据转换为 JSON
【发布时间】:2014-02-14 12:24:01
【问题描述】:

我想将数据库数据转换为 JSON,但是我使用 JavaScriptSerializer 使用本网站的代码得到的结果是这样的

[{"Yes":6,"No":1,"Maybe":4}].

我的数据库表包含三列,分别命名为 YesNoMaybe,但我想要一个 JSON 格式,例如:

[{"name":"Yes","data":6},{"name":"No","data":2},{"name":"Maybe","data":3}].

表示如何在VB中将其转换为key:value对?

我的代码是:

Dim serializer As New System.Web.Script.Serialization.JavaScriptSerializer()
Dim rows As New List(Of Dictionary(Of String, Object))()
Dim row As Dictionary(Of String, Object)
For Each dr As DataRow In dt.Rows
    row = New Dictionary(Of String, Object)()
    For Each col As DataColumn In dt.Columns
        row.Add(col.ColumnName, dr(col))
    Next
    rows.Add(row)
Next
json_data = serializer.Serialize(rows)

【问题讨论】:

  • 我收到错误“已添加具有相同键的项目。”它不允许再次插入具有相同键的数据

标签: asp.net json vb.net


【解决方案1】:

改成

For Each col As DataColumn In dt.Columns
    row.Add("name", col.ColumnName)
    row.Add("data", dr(col))

【讨论】:

  • 我收到错误“已添加具有相同键的项目。”它不允许再次插入具有相同键的数据
  • 但这是合乎逻辑的,因为它是一本字典,如果你必须重复键(我不明白为什么)只需使用键和值列表 - KeyValuePai
【解决方案2】:

问题不在代码中。问题是数据库模式一开始就不好。

不好:

+---------+--------+-----------+
| Yes     | No     | Maybe     |
+---------+--------+-----------+
|       6 |      2 |         4 |
+---------+--------+-----------+

好:

+---------+--------+
| Name    | Data   |
+---------+--------+
| Yes     |      6 |
+---------+--------+
| No      |      2 |
+---------+--------+
| Maybe   |      4 |
+---------+--------+

编辑

@Downvoter:假设您想稍后添加一个新属性“也许”。

+---------+--------+
| Name    | Data   |
+---------+--------+
| Yes     |      6 |
+---------+--------+
| No      |      2 |
+---------+--------+
| Maybe   |      4 |
+---------+--------+
| Perhaps |      9 |
+---------+--------+

您将如何在原始表格中执行此操作?

您可能猜到了:通过更改数据库结构以适应业务模型。

【讨论】:

  • 应该存在不同数据的相同问题或不存在“虚拟”数据,数据库上完全有效的结构需要业务模型上的不同结构,所以我知道更改数据库结构以适应业务模型是一个糟糕的答案.
  • @Bardo“完全有效”不等于“完美”。鉴于我们对问题域的了解,更改表定义是正确的解决方案。
  • 我认为你错过了作者给出的数据显然是“虚拟”数据。我们不能只假设一个数据库结构问题。作者要求一个明确的编程问题,如果没有进一步的信息,我不能假设一个答案要求他改变它的数据库结构。对不起。
  • 我可以假设是数据库结构问题。即使从虚拟数据中,您也可以推断出每一列代表相同的现实世界概念。只有列名不同。这是一种应该消除的冗余形式。
  • 加上作者想使用表列的名称作为值的事实。这应该会立即在您的思考过程中触发红色警报。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-06-21
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 2014-09-10
  • 2016-04-27
  • 2020-05-29
相关资源
最近更新 更多