如何在VB.NET中创建类序列化Recreation.gov营地JSON数据
问题分析与解决方案
首先明确:你拿到的JSON格式是有效的,只是存在一个小笔误("2023-08-0T00:00:00Z"日期少了一位数字,应该是"2023-08-01T00:00:00Z"这类合法格式),但整体结构符合JSON规范。
你遇到的序列化问题,根源是自动生成工具(jsonutils)无法识别JSON里的动态键结构:
campsites下的"1"、"2"是营地ID,属于动态键,本质是键值对集合,不是固定属性availabilities和quantities下的日期字符串也是动态键,同样是键值对集合
自动工具把这些动态键转换成了固定类属性,自然无法适配不同营地、不同日期的返回数据,导致序列化失败。
正确的VB类结构定义
把动态键对应的部分改成Dictionary类型,就能完美适配这种结构:
Imports System.Collections.Generic Public Class CampsiteResponse Public Property campsites As Dictionary(Of String, Campsite) Public Property count As Integer End Class Public Class Campsite Public Property availabilities As Dictionary(Of String, String) Public Property campsite_id As String Public Property campsite_reserve_type As String Public Property campsite_rules As Object Public Property campsite_type As String Public Property capacity_rating As String Public Property loop As String Public Property max_num_people As Integer Public Property min_num_people As Integer Public Property quantities As Dictionary(Of String, Integer) Public Property site As String Public Property supplemental_camping As Object Public Property type_of_use As String End Class
序列化/反序列化示例(以Newtonsoft.Json为例)
如果使用Newtonsoft.Json库,直接用下面的代码就能完成反序列化:
Dim jsonString As String = ' 你的API返回JSON字符串 Dim response = Newtonsoft.Json.JsonConvert.DeserializeObject(Of CampsiteResponse)(jsonString) ' 遍历所有营地 For Each kvp In response.campsites Dim campsiteId = kvp.Key Dim campsite = kvp.Value Console.WriteLine($"营地ID: {campsiteId},站点编号: {campsite.site}") ' 遍历该营地的可用性 For Each availabilityKvp In campsite.availabilities Dim dateStr = availabilityKvp.Key Dim status = availabilityKvp.Value Console.WriteLine($"日期: {dateStr},状态: {status}") Next Next
如果用System.Text.Json,需要确保配置支持字典的序列化:
Dim options = New System.Text.Json.JsonSerializerOptions With { .PropertyNameCaseInsensitive = True ' 忽略大小写匹配属性 } Dim response = System.Text.Json.JsonSerializer.Deserialize(Of CampsiteResponse)(jsonString, options)
内容的提问来源于stack exchange,提问作者Jeremiah Haney
相关产品推荐
相关产品推荐

