You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用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

火山引擎 最新活动