You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将含可变键名的JSON反序列化为VB.NET对象?

解决VB.NET中JSON可变键名的反序列化问题

你的问题核心是JSON结构中存在可变键名(比如示例中的USERNAME1,且可能有多个类似键),而你原本的类定义用固定名称的属性去匹配,导致反序列化失败。以下是两种直接可行的解决方案:

方案一:直接反序列化为字典类型

跳过自定义的COLLECTION类,直接将JSON反序列化为Dictionary(Of String, List(Of WORKDAY)),字典的Key会自动匹配JSON中的可变用户名(如USERNAME1),Value则对应用户的工作日列表:

Imports Newtonsoft.Json

' 保持WORKDAY、WORKTIME、WORKTIMETYPE类定义不变,但需修正数据类型(见下方说明)
Dim jsonStr As String = "你的JSON字符串"
Dim userWorkdays As Dictionary(Of String, List(Of WORKDAY)) = JsonConvert.DeserializeObject(Of Dictionary(Of String, List(Of WORKDAY)))(jsonStr)

' 遍历所有用户的工作日数据
For Each kvp In userWorkdays
    Console.WriteLine($"用户名:{kvp.Key}")
    For Each workday In kvp.Value
        Console.WriteLine($"工作日:{workday.beginDate},工作时长:{workday.workingTimeMinutes}分钟")
    Next
Next

方案二:修改COLLECTION类使用字典属性

如果你希望保留COLLECTION类的结构,只需将原本固定名称的USERS属性替换为字典类型,让它能接收任意键名的用户数据:

Imports Newtonsoft.Json

Public Class COLLECTION
    ' 用字典替代固定列表,键为可变用户名,值为工作日列表
    Public Property Users As Dictionary(Of String, List(Of WORKDAY)) = New Dictionary(Of String, List(Of WORKDAY))
End Class

' 修正WORKDAY类的数据类型(JSON中是整数,原类定义为String会导致转换错误)
Public Class WORKDAY
    Public workingTimes As New List(Of WORKTIME)
    Public beginDate As String
    Public targetWorkingTimeMinutes As Integer ' 原String改为Integer
    Public breakDurationMinutes As Integer ' 原String改为Integer
    Public workingTimeMinutes As Integer ' 原String改为Integer
    Public endDate As String
End Class

Public Class WORKTIME
    Public endDateAndTime As String
    Public beginDateAndTime As String
    Public workingTimeType As WORKTIMETYPE
    Public name As String
    Public type As String
    Public id As String
End Class

Public Class WORKTIMETYPE
    Public type As String
    Public name As String
End Class

' 反序列化代码
Dim jsonStr As String = "你的JSON字符串"
Dim collection As COLLECTION = JsonConvert.DeserializeObject(Of COLLECTION)(jsonStr)

关键注意事项

  • 数据类型匹配:你原本的WORKDAY类中,targetWorkingTimeMinutes等字段在JSON里是整数类型,但类定义为String,这会导致反序列化时的类型转换错误,必须修正为Integer。
  • 依赖库:以上示例使用的是Newtonsoft.Json(Json.NET),如果你的项目使用System.Text.Json,语法略有不同,但核心思路一致——用字典接收可变键名。

内容的提问来源于stack exchange,提问作者blueshift

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 00:42:38