如何用Newtonsoft在VB.NET中反序列化元素名多变的JSON?
解决Newtonsoft反序列化动态键数组的问题
嗨Martin,我之前正好碰到过一模一样的场景!这种JSON里数组元素用动态命名键的情况,其实用Newtonsoft的Dictionary(Of String, T)就能完美解决,不用复杂的自定义转换器。下面给你具体的实现步骤:
1. 先定义对应的数据类
首先,你需要先把每个动态键对应的元素结构定义成一个VB.NET类。假设你的JSON里每个动态元素(比如"ABC"、"UZT")的结构是这样的:
示例JSON片段:
"ABC": { "Name": "测试A", "Value": 100 }, "UZT": { "Name": "测试B", "Value": 200 }
那对应的元素类可以这么写:
Public Class DynamicItem Public Property Name As String Public Property Value As Integer End Class
2. 用Dictionary接收动态键的集合
接下来,根据你的JSON层级来定义根类:
- 如果这些动态键是嵌套在某个字段里(比如外层有个
Data字段),根类就用Dictionary(Of String, DynamicItem)作为该字段的类型:
Public Class RootModel Public Property Data As Dictionary(Of String, DynamicItem) End Class
- 如果你的JSON本身就是顶级的动态键集合(没有外层字段),那直接反序列化为
Dictionary(Of String, DynamicItem)就行,不用根类。
3. 执行反序列化操作
现在就可以用Newtonsoft的JsonConvert.DeserializeObject方法来处理了:
' 假设你的JSON字符串存在json变量中 Dim json As String = "你的完整JSON内容" ' 情况1:有外层根类 Dim rootResult = JsonConvert.DeserializeObject(Of RootModel)(json) ' 访问动态元素:比如获取"ABC"的值 Dim abcItem = rootResult.Data("ABC") Console.WriteLine($"ABC的Name: {abcItem.Name}, Value: {abcItem.Value}") ' 情况2:直接是顶级动态键集合 Dim directResult = JsonConvert.DeserializeObject(Of Dictionary(Of String, DynamicItem))(json) ' 遍历所有动态元素 For Each kvp In directResult Console.WriteLine($"键名: {kvp.Key}, 名称: {kvp.Value.Name}, 值: {kvp.Value.Value}") Next
额外提示
如果你的动态元素结构有更复杂的嵌套,或者需要对键名做特殊处理(比如忽略大小写),可以在反序列化时配置JsonSerializerSettings:
Dim settings = New JsonSerializerSettings With { .ContractResolver = New DefaultContractResolver With { .IgnoreSerializableAttribute = True, .IgnoreSerializableInterface = True, .NamingStrategy = New CamelCaseNamingStrategy() ' 如果需要驼峰命名转换 }, .CaseInsensitive = True ' 忽略键名的大小写 } Dim result = JsonConvert.DeserializeObject(Of RootModel)(json, settings)
这样就能轻松处理这种动态键的JSON反序列化啦!
内容的提问来源于stack exchange,提问作者Martin




