英文:
How to create a class to serialize recreation.gov campsite json data in vb.net
问题
struct RootObject: Codable {
let campsites: Campsites
let count: Int
}
struct Campsites: Codable {
let _1: Campsite
let _2: Campsite
}
struct Campsite: Codable {
let availabilities: Availabilities
let campsite_id: String
let campsite_reserve_type: String
let campsite_rules: String? // Replace 'Object' with the correct type if possible
let campsite_type: String
let capacity_rating: String
let loop: String
let max_num_people: Int
let min_num_people: Int
let quantities: Quantities
let site: String
let supplemental_camping: String? // Replace 'Object' with the correct type if possible
let type_of_use: String
}
struct Availabilities: Codable {
let _20230801T000000Z: String
let _2023080T000000Z: String
}
struct Quantities: Codable {
let _20230801T000000Z: Int
let _20230831T000000Z: Int
}
英文:
I am trying to use the recreations.gov api to find available campsites. When I receive the data I am not sure how to serialize it. Can someone help me create the correct class structure? I removed some of the availability and quantity entries. One for each day of the month is returned.
Thanks,
Jeremiah
{
"campsites": {
"1": {
"availabilities": {
"2023-08-01T00:00:00Z": "Reserved",
"2023-08-0T00:00:00Z": "Reserved"
},
"campsite_id": "1",
"campsite_reserve_type": "Site-Specific",
"campsite_rules": null,
"campsite_type": "RV NONELECTRIC",
"capacity_rating": "Single",
"loop": "C ",
"max_num_people": 6,
"min_num_people": 0,
"quantities": {
"2023-08-01T00:00:00Z": 0,
"2023-08-31T00:00:00Z": 0
},
"site": "065",
"supplemental_camping": null,
"type_of_use": "Overnight"
},
"2": {
"availabilities": {
"2023-08-01T00:00:00Z": "Reserved",
"2023-08-31T00:00:00Z": "Reserved"
},
"campsite_id": "2",
"campsite_reserve_type": "Site-Specific",
"campsite_rules": null,
"campsite_type": "RV NONELECTRIC",
"capacity_rating": "Single",
"loop": "C",
"max_num_people": 6,
"min_num_people": 0,
"quantities": {
"2023-08-01T00:00:00Z": 0,
"2023-08-31T00:00:00Z": 0
},
"site": "066",
"supplemental_camping": null,
"type_of_use": "Overnight"
}
},
"count": 99
}
I have read tons of post about json serialization and tried creating the class with https://jsonutils.com/ but the values become properties of the class which doesn't make sense. I am wondering if the json they return is invalid.
Public Class Rootobject
Public Property campsites As Campsites
Public Property count As Integer
End Class
Public Class Campsites
Public Property _1 As _1
Public Property _2 As _2
End Class
Public Class _1
Public Property availabilities As Availabilities
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 Quantities
Public Property site As String
Public Property supplemental_camping As Object
Public Property type_of_use As String
End Class
Public Class Availabilities
Public Property _20230801T000000Z As String
Public Property _2023080T000000Z As String
End Class
Public Class Quantities
Public Property _20230801T000000Z As Integer
Public Property _20230831T000000Z As Integer
End Class
Public Class _2
Public Property availabilities As Availabilities1
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 Quantities1
Public Property site As String
Public Property supplemental_camping As Object
Public Property type_of_use As String
End Class
Public Class Availabilities1
Public Property _20230801T000000Z As String
Public Property _20230831T000000Z As String
End Class
Public Class Quantities1
Public Property _20230801T000000Z As Integer
Public Property _20230831T000000Z As Integer
End Class
答案1
得分: 0
这个解决方案需要一些手动操作。
json类:
Imports Newtonsoft.Json
Public Class CampSiteProcessor
Public Class RecreationSite
Public Sub New()
CampSiteLists = New List(Of Campsite)
End Sub
Public Property CampSiteLists As List(Of Campsite)
Public Property campsites As String
Public Property count As Integer
End Class
Public Class Campsite
Public Sub New()
AvailObjects = New List(Of AvailObject)
QuantityObjects = New List(Of QuantityObject)
End Sub
Public Property AvailObjects As IList(Of AvailObject)
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
<JsonProperty(PropertyName:="loop")>
Public Property _loop As String
Public Property max_num_people As Integer
Public Property min_num_people As Integer
Public Property QuantityObjects As IList(Of QuantityObject)
Public Property site As String
Public Property supplemental_camping As Object
Public Property type_of_use As String
End Class
Public Class AvailObject
Public Property DateValue As String
Public Property StringValue As String
End Class
Public Class QuantityObject
Public Property DateValue As String
Public Property AmountValue As String
End Class
End Class
解析传入的json并得到一个营地集合的方法:
Private Sub ParseCampSites(jsonString As String)
Dim token As JToken = JObject.Parse(jsonString)
' 找到营地集合
Dim campsitesjson = token.SelectToken("campsites")
Dim recSite As New RecreationSite
Dim campcounter As Integer = 0
' 循环遍历集合
For Each obj In campsitesjson
campcounter += 1
' 找到特定的营地
Dim campSiteToken = token.SelectToken($"campsites.{campcounter}")
Dim campSiteItem As Campsite = JsonConvert.DeserializeObject(Of Campsite)(campSiteToken.ToString)
' 找到可用性列表
Dim availabilities = token.SelectToken($"campsites.{campcounter}.availabilities")
For Each item As Object In availabilities
Dim dateValue As String = item.name
Dim statusValue As String = item.value
campSiteItem.AvailObjects.Add(New AvailObject With {.DateValue = dateValue, .StringValue = statusValue})
Next
' 找到数量列表
Dim quantities = token.SelectToken($"campsites.{campcounter}.quantities")
For Each item As Object In quantities
Dim dateValue As String = item.name
Dim amountValue As String = item.value
campSiteItem.QuantityObjects.Add(New QuantityObject With {.DateValue = dateValue, .AmountValue = amountValue})
Next
' 将营地添加到集合
recSite.CampSiteLists.Add(campSiteItem)
Next
End Sub
英文:
This solution will get you there with a bit of manual effort.
The json class:
Imports Newtonsoft.Json
Public Class CampSiteProcessor
Public Class RecreationSite
Public Sub New()
CampSiteLists = New List(Of Campsite)
End Sub
Public Property CampSiteLists As List(Of Campsite)
Public Property campsites As String
Public Property count As Integer
End Class
Public Class Campsite
Public Sub New()
AvailObjects = New List(Of AvailObject)
QuantityObjects = New List(Of QuantityObject)
End Sub
Public Property AvailObjects As IList(Of AvailObject)
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
<JsonProperty(PropertyName:="loop")>
Public Property _loop As String
Public Property max_num_people As Integer
Public Property min_num_people As Integer
Public Property QuantityObjects As IList(Of QuantityObject)
Public Property site As String
Public Property supplemental_camping As Object
Public Property type_of_use As String
End Class
Public Class AvailObject
Public Property DateValue As String
Public Property StringValue As String
End Class
Public Class QuantityObject
Public Property DateValue As String
Public Property AmountValue As String
End Class
End Class
A method to parse the incoming json and leave you with a collection of campsites:
Private Sub ParseCampSites(jsonString As String)
Dim token As JToken = JObject.Parse(jsonString)
' find the campsites collection
Dim campsitesjson = token.SelectToken("campsites")
Dim recSite As New RecreationSite
Dim campcounter As Integer = 0
' loop through the collection
For Each obj In campsitesjson
campcounter += 1
' find the specific campsite
Dim campSiteToken = token.SelectToken($"campsites.{campcounter}")
Dim campSiteItem As Campsite = JsonConvert.DeserializeObject(Of Campsite)(campSiteToken.ToString)
' find the availabilities list
Dim availabilities = token.SelectToken($"campsites.{campcounter}.availabilities")
For Each item As Object In availabilities
Dim dateValue As String = item.name
Dim statusValue As String = item.value
campSiteItem.AvailObjects.Add(New AvailObject With {.DateValue = dateValue, .StringValue = statusValue})
Next
' find the quantities list
Dim quantities = token.SelectToken($"campsites.{campcounter}.quantities")
For Each item As Object In quantities
Dim dateValue As String = item.name
Dim amountValue As String = item.value
campSiteItem.QuantityObjects.Add(New QuantityObject With {.DateValue = dateValue, .AmountValue = amountValue})
Next
' add campsite to collection
recSite.CampSiteLists.Add(campSiteItem)
Next
End Sub
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论