【发布时间】:2021-01-19 12:33:54
【问题描述】:
某些 Shopify API 在未配置时不会返回节点,而是返回空值。
JSON 示例
{
"orders": [
{
"id": 1,
"customer": {
"id": 001,
}
},
{
"id": 2
}
]
}
为了反序列化 Json,我需要在类对象中包含所有属性。
Public Class AllOrders
Public Property orders() As List(Of Order)
End Class
Public Class Order
Public Property id As Long?
Public Property customer() As Customer
End Class
Public Class Customer
Public Property id As Long?
End Class
如何在不复杂的if 语句的情况下有效地跳过丢失的节点。
问题不在于 json 的反序列化,而是试图读取不存在的命名成员。
Dim AllOrders = JsonConvert.DeserializeObject(Of AllOrders)(GetOrders())
For Each order As Shopify.Order In AllOrders.orders
Dim test as order.customer.id
'Error NullReferenceException on customer
Next
这可以在 Json.Net 框架内处理吗?
JsonSerializerSettings
我应该注意我已经尝试了以下设置。
Dim settings = New JsonSerializerSettings With {
.NullValueHandling = NullValueHandling.Ignore,
.MissingMemberHandling = MissingMemberHandling.Ignore
}
【问题讨论】:
-
DeserializeObject有一个重载,它采用JsonSerializerSettings并且有一个JsonSerializerSettings.NullValueHandling属性。 newtonsoft.com/json/help/html/… -
您在这里的预期行为是什么?如果节点不存在,那么你想分配什么值?
-
@JohnPete22 在这种情况下,可以接受 Null 或 0。因为我可能不得不对每个属性应用这个检查,所以我试图避免在大约 500 个单独的属性上声明 if 语句。
-
将客户设置为
<JsonProperty("customer", NullValueHandling:=NullValueHandling.Include)> Public Property Customer As Customer = New Customer怎么样?无论如何,它将创建Customer对象,并且其Id属性将设置为0的默认值(以防0的值不是可能的值,否则它会产生误导并且处理空值是一种方式更好)
标签: json vb.net json.net deserialization shopify