VB.NET如何处理API返回的两种不同格式JSON序列化
兼容两种Address格式的JSON序列化方案(无需备用Person类)
可以通过自定义JSON转换器实现兼容,以下以.NET生态中常用的Newtonsoft.Json库为例给出具体实现步骤:
1. 调整Person类结构
将Person类中Address属性的类型从String改为自定义的Address类,并为该属性标记自定义转换器特性:
Imports Newtonsoft.Json Public Class Person <JsonConverter(GetType(AddressConverter))> Public Property Address As Address End Class Public Class Address Public Property City As String Public Property Line As String Public Property State As String Public Property Zip As String End Class
2. 实现自定义JsonConverter
这个转换器负责处理两种格式的转换逻辑:反序列化时识别字符串/对象类型并分别解析,序列化时可按需输出对应格式:
Imports Newtonsoft.Json Imports Newtonsoft.Json.Linq Public Class AddressConverter Inherits JsonConverter(Of Address) ' 反序列化:处理字符串或对象格式的Address Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Address, hasExistingValue As Boolean, serializer As JsonSerializer) As Address Select Case reader.TokenType Case JsonToken.String ' 解析字符串格式的地址(需根据实际返回的字符串格式调整拆分逻辑) Dim addressStr = reader.Value.ToString() Dim parts = addressStr.Split({" "}, StringSplitOptions.RemoveEmptyEntries) If parts.Length >= 4 Then Return New Address With { .Line = String.Join(" ", parts.Take(parts.Length - 3)), .City = parts(parts.Length - 3), .State = parts(parts.Length - 2), .Zip = parts(parts.Length - 1) } End If Return New Address() Case JsonToken.StartObject ' 直接反序列化对象格式的Address Dim jObj = JObject.Load(reader) Return jObj.ToObject(Of Address)(serializer) Case Else Throw New JsonSerializationException($"不支持的Address格式:{reader.TokenType}") End Select End Function ' 序列化:按需选择输出字符串或对象格式(示例为输出字符串) Public Overrides Sub WriteJson(writer As JsonWriter, value As Address, serializer As JsonSerializer) If value IsNot Nothing Then Dim addressStr = $"{value.Line} {value.City} {value.State} {value.Zip}" writer.WriteValue(addressStr) Else writer.WriteNull() End If ' 若需要输出对象格式,替换为以下代码: ' serializer.Serialize(writer, value) End Sub End Class
3. 使用示例
定义顶层对象类后,即可正常反序列化两种JSON格式:
' 对应JSON顶层结构的类 Public Class RootObject Public Property person As List(Of Person) End Class ' 反序列化格式1 Dim json1 = "{""person"": [{""Address"": ""PO Box 14079 Lexington KY 40512""}]}" Dim result1 = JsonConvert.DeserializeObject(Of RootObject)(json1) ' 反序列化格式2 Dim json2 = "{""person"": [{""Address"": {""City"": ""Lexington"", ""Line"": ""PO Box 14079"", ""State"": ""KY"", ""Zip"": ""40512""}}]}" Dim result2 = JsonConvert.DeserializeObject(Of RootObject)(json2)
关键说明
- 字符串解析逻辑需根据API返回的实际地址格式调整,示例仅为通用参考;
- 若使用System.Text.Json而非Newtonsoft.Json,可通过实现
JsonConverter<Address>接口完成类似逻辑。
内容的提问来源于stack exchange,提问作者Peter Sun
相关产品推荐
相关产品推荐

