且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

如何反序列化可以是数组或单个对象的JSON

更新时间:2022-06-26 01:06:22

以下是如何在链接的重复的问题适用于您的用例.

Here is how to get the SingleOrArrayConverter solution in the linked duplicate question working for your use case.

首先,这是VB转换的转换器代码.将此并保存到项目中某个位置的类文件中.然后,您可以轻松地在以后的任何情况下重用它.

First, here is the VB-translated converter code. Take this and save it to a class file somewhere in your project. You can then easily reuse it for any future cases like this.

Imports Newtonsoft.Json
Imports Newtonsoft.Json.Linq

Public Class SingleOrArrayConverter(Of T)
    Inherits JsonConverter

    Public Overrides Function CanConvert(objectType As Type) As Boolean
        Return objectType = GetType(List(Of T))
    End Function

    Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object
        Dim token As JToken = JToken.Load(reader)

        If (token.Type = JTokenType.Array) Then
            Return token.ToObject(Of List(Of T))()
        End If

        Return New List(Of T) From {token.ToObject(Of T)()}
    End Function

    Public Overrides ReadOnly Property CanWrite As Boolean
        Get
            Return False
        End Get
    End Property

    Public Overrides Sub WriteJson(writer As JsonWriter, value As Object, serializer As JsonSerializer)
        Throw New NotImplementedException
    End Sub

End Class

现在有了此转换器,只要您拥有一个可以是列表或单个项目的属性,您要做的就是将其声明为类中的列表,然后用属性,以便它使用SingleOrArrayConverter类.在您的情况下,看起来像这样:

Now that you have this converter, any time you have a property that can be either a list or a single item, all you have to do is declare it as a list in your class and then annotate that list with a JsonConverter attribute such that it uses the SingleOrArrayConverter class. In your case, that would look like this:

Public Class jsonCar
    Public Property make As String
    Public Property model As String
    <JsonConverter(GetType(SingleOrArrayConverter(Of jsonCarLines)))>
    Public Property lines As List(Of jsonCarLines)
    Public Property year As String
End Class

然后,按照通常的方式反序列化,即可正常使用.

Then, just deserialize as you normally would, and it works as expected.

Dim car As jsonCar = JsonConvert.DeserializeObject(Of jsonCar)(json)

这是一个完整的演示: https://dotnetfiddle.net/msYNeQ

Here is a complete demonstration: https://dotnetfiddle.net/msYNeQ