将json转换为数据表vb

Mad*_*Mad 5 vb.net datatable serialization json deserialization

早上好,今天我试图将我的 json 转换为数据表。

这就是我想要做的

    Dim webclient_server7 As New System.Net.WebClient
    Dim json_result As String = webclient_server7.DownloadString("http://myhost/api/mycontroller/GetQuery")
    Dim json_jsonstring = Newtonsoft.Json.JsonConvert.SerializeObject(json_result)

    Try
        Dim table As DataTable = JsonConvert.DeserializeObject(Of DataTable)(json_jsonstring)
    Catch ex As Exception
        MsgBox("An exception occured: " & ex.Message)
    End Try
Run Code Online (Sandbox Code Playgroud)

我收到一个异常说:

发生异常:读取数据表时出现意外的 JSON 令牌。预期的 StartArray,得到 String。路径 '',第 1 行,位置 9919。

我在json lint上验证了我的 json ,它说我的 json 是有效的。
有没有人可以帮我解决这个问题?

这是我的原始 json 的副本

Description=,Negate Value=,\"\r\n }\r\n ]\r\n}"发生异常:读取数据表时出现意外的 JSON 标记。预期的 StartArray,得到 String。路径 '',第 1 行,位置 9919。

dbc*_*dbc 5

首先,您需要删除此行:

Dim json_jsonstring = Newtonsoft.Json.JsonConvert.SerializeObject(json_result)
Run Code Online (Sandbox Code Playgroud)

下载的字符串已经是JSON,如果你再次序列化它你会将它变成一个转义的 JSON 字符串文字,因此反序列化它返回字符串 - 而不是DataTable你想要的。这解释了错误Unexpected JSON token when reading DataTable. Expected StartArray, got String. Path '', line 1, position 9919:Json.NET 将整个json_jsonstring字符串解析为单个转义字符串文字。

其次,您的 JSON 包含一个外部根对象,如下所示:

{
  "Table": [
    {
      "IdOwner": "Davide", 
      // Additional properties
    },
    // Additional rows.
  ]
}
Run Code Online (Sandbox Code Playgroud)

因此,您需要引入一个具有必要Table属性的根对象以将其反序列化DataTable。您可以使用以下通用根执行此操作:

Class RootObject(Of T)
    Public Property Table As T
End Class
Run Code Online (Sandbox Code Playgroud)

然后反序列化如下:

Dim table = JsonConvert.DeserializeObject(Of RootObject(Of DataTable))(json_result).Table
Run Code Online (Sandbox Code Playgroud)

样品小提琴

或者,如果您不想创建根类型,请反序列化为一个临时的Dictionary(Of string, DataTable)

Dim table = JsonConvert.DeserializeObject(Of Dictionary(Of string, DataTable))(json_result).Values.SingleOrDefault()
Run Code Online (Sandbox Code Playgroud)

示例小提琴 #2

您问,我想知道删除“{ Table:”部分和最后一个} 的某种“子字符串”是否可行? 当然这是可能的,但我不推荐这样做。您将手动复制 JSON 解析器的某些逻辑。让 Json.NET 为您完成工作,它将正确处理空格和换行符。


Mad*_*Mad 3

经过近一年的 json 实践后,我决定回答我的问题。如果您实际上尝试将 json 反序列化为数据表,我们可以假设您使用的是vb.netc#(换句话说 Visual Studio)。

要完成此任务,请遵循我的列表:

0)从 Nuget 下载并安装 Newtonsoft.json
1)复制原始 json
2)在解决方案中创建一个新类并根据需要命名。(例如:MyDatatable.vb
3)在Mydatatable.vb页面中:修改->选择性粘贴->将JSON粘贴为类(这是关键)

此时,Visual Studio 将开始创建一堆类,这些类将帮助 newtonsoft 将 json 反序列化到主对象中。就我而言,主要对象是一个名为Table的类 ,如下所示:

"{\r\n \"\": [\r\n {\r\n \"IdOwner\": \"Davide\",\r\n \"tag_id\": 1,\r\n \"tag_type\": \"3\",\r\n \"tag_group\": \"Group_2\",\r\n \"tag_name\": \"Alfa\",\r\n \" tag_sequence\": 123458,\r\n \"tag_description\": \"Description_2\",\r\n \"tag_short_descritpion\": \"Desc_2\",\r\n \"tag_um\": \" kg\",\r\n \"tag_active\": true,\r\n \"tag_colle

4)此时你将拥有

  • 名为 MyDatatable.vb 的类文件,其中包含许多其他类,例如 ( *Table )
  • Newtonsoft 参考安装在您的项目上

这将允许您使用 2 条指令反序列化 json:

Dim strMyJson as string = [your raw json here]
Dim tbFinalObject as Table = Newtonsoft.json.jsonconver.deserializeObject(of Table)(strMyJson)
Run Code Online (Sandbox Code Playgroud)

因此,在 tbFinalObject 对象中,您将反序列化 json。注意:如果第二条指令给你一个类似“expected some char at line x”的错误,这可能是因为你的 json 需要先反序列化为字符串,然后才能反序列化为另一个对象,所以你应该有一组如下指令:

 Dim strMyJson as string = [your raw json here]
 Dim strMyJson as string = Newtonsoft.json.jsonconvert.deserializeObject(of string)([your raw json here])
 Dim tbFinalObject as Table = Newtonsoft.json.jsonconvert.deserializeObject(of Table)(strMyJson)
Run Code Online (Sandbox Code Playgroud)

这就是我解决 json 和 vb.net 反序列化的大部分问题的方法。

进一步说明:当您将 json 粘贴为类时,Visual Studio 将自动创建对象并创建一些属性作为数组。我习惯用列表替换数组,因为我发现一些旧版本的 newtonsoft 在将 json 反序列化为数组时存在一些问题。