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。
首先,您需要删除此行:
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 为您完成工作,它将正确处理空格和换行符。
经过近一年的 json 实践后,我决定回答我的问题。如果您实际上尝试将 json 反序列化为数据表,我们可以假设您使用的是vb.net或c#(换句话说 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)此时你将拥有
这将允许您使用 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 反序列化为数组时存在一些问题。
| 归档时间: |
|
| 查看次数: |
16363 次 |
| 最近记录: |