C# 无法将当前JSON对象(例如,{quot;name";:“value";})反序列化为类型';System.Collections.Generic.IList
我有下面的JSONC# 无法将当前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
{
"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