C# 无法将当前JSON对象(例如,{quot;name";:“value";})反序列化为类型';System.Collections.Generic.IList

C# 无法将当前JSON对象(例如,{quot;name";:“value";})反序列化为类型';System.Collections.Generic.IList,c#,json,vb.net,serialization,json.net,C#,Json,Vb.net,Serialization,Json.net,我有下面的JSON { "response": { "feedMessageResponse": { "count": 1, "feed": { "id": "0nOCG6C0TBCMWdT0YPQYm4n8zxxxxgDQ", "name": "Nav1", "description": "Nav 1", "status": "ACTIVE", "usage": 0, "da

我有下面的JSON

{
"response": {
  "feedMessageResponse": {
     "count": 1,
     "feed": {
        "id": "0nOCG6C0TBCMWdT0YPQYm4n8zxxxxgDQ",
        "name": "Nav1",
        "description": "Nav 1",
        "status": "ACTIVE",
        "usage": 0,
        "daysRange": 7,
        "detailedMessageShown": true
     },
     "totalCount": 1,
     "activityCount": 0,
     "messages": {
        "message": {
           "@clientUnixTime": "0",
           "id": 464064302,
           "messengerId": "0-8061742",
           "messengerName": "Navigator1",
           "unixTime": 1445904943,
           "messageType": "OK",
           "latitude": -39.1234,
           "longitude": 140.1234,
           "modelId": "SPOT2",
           "showCustomMsg": "Y",
           "dateTime": "2015-10-27T00:15:43+0000",
           "batteryState": "GOOD",
           "hidden": 0,
           "messageContent": "We have reached this place safely."
        }
     }
   }
 }
}
存在大量属性,但当只有1个response.feedMessageResponse.messages.message时,我会收到一个反序列化错误,说明:

无法反序列化当前JSON对象(例如{“名称”:“值”}) 打字 'System.Collections.Generic.IList`1[ITBeyond.Mapping.Tracking+SpotMessenger+Message]' 因为该类型需要一个JSON数组(例如[1,2,3])来反序列化 正确地要修复此错误,请将JSON更改为JSON数组 (例如[1,2,3])或更改反序列化类型,使其成为正常类型 .NET类型(例如,不是integer之类的基元类型,也不是集合 可以从JSON反序列化的类型(如数组或列表) 对象还可以将JsonObjectAttribute添加到类型以强制它 从JSON对象反序列化。路径 'response.feedMessageResponse.messages.message.@clientUnixTime',第行 1,位置287

如果有多条消息,则可以正常工作。围绕此错误的两个属性定义为:

Public Class Messages
            <JsonProperty("message")> _
            Public Property Message() As IList(Of Message)
                Get
                    Return m_Message
                End Get
                Set(value As IList(Of Message))
                    m_Message = value
                End Set
            End Property
            Private m_Message As IList(Of Message)
        End Class

        Public Class Message
            <JsonProperty("@clientUnixTime")> _
            Public Property ClientUnixTime() As String
                Get
                    Return m_ClientUnixTime
                End Get
                Set(value As String)
                    m_ClientUnixTime = value
                End Set
            End Property
         Private m_ClientUnixTime As String

dbc提供的链接提供了答案。我必须使用vb.net编写代码,下面是转换后的代码和答案:

将消息转换为使用自定义JsonConverter

        Public Class Messages
            <JsonProperty("message")>
            <JsonConverter(GetType(SingleOrArrayConverter(Of Message)))>
            Public Property Message() As IList(Of Message)
                Get
                    Return m_Message
                End Get
                Set(value As IList(Of Message))
                    m_Message = value
                End Set
            End Property
            Private m_Message As IList(Of Message)
        End Class

dbc提供的链接提供了答案。我必须使用vb.net编写代码,下面是转换后的代码和答案:

将消息转换为使用自定义JsonConverter

        Public Class Messages
            <JsonProperty("message")>
            <JsonConverter(GetType(SingleOrArrayConverter(Of Message)))>
            Public Property Message() As IList(Of Message)
                Get
                    Return m_Message
                End Get
                Set(value As IList(Of Message))
                    m_Message = value
                End Set
            End Property
            Private m_Message As IList(Of Message)
        End Class

messages
对象中只有一个
message
对象。当存在多条消息时,JSON是什么样子的?请参见此处:。甚至还包含了一个VB.NET答案。我已经用多消息示例更新了这个问题。看起来您可以在
“message”
属性上使用
。@dbc-perfect刚刚实现了它,它可以工作-谢谢。
messages
对象中只有一个
message
对象。当存在多条消息时,JSON是什么样子的?请参见此处:。甚至还有一个VB.NET答案。我已经用多消息示例更新了这个问题。看起来您可以使用
“message”
属性中的
。@dbc-perfect刚刚实现了它,它可以工作了-谢谢。
      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