反序列化JSON字符串,该字符串是数组,并且具有非法的属性名称

VBobCat

我正在使用JSON.NET对来自HTTP查询的JSON响应进行反序列化,但是反序列化方面存在问题。

源JSON是这样的:

[
  {
    "type": "rpc",
    "tid": 18,
    "action": "TaskSystem",
    "method": "createTask",
    "result": {
      "0": {
        "success": true,
        "successes": [
          [
            "Task successfuly created with S/N #22920"
          ]
        ]
      },
      "1": {
        "success": true,
        "successes": [
          [
            "Task successfuly created with S/N #22921"
          ],
          "Task #22921 marked as urgent"
        ]
      },
      "records": [
        {
          "id": 22920
        },
        {
          "id": 22921
        }
      ],
      "success": true
    }
  }
]

我一直在使用这些类进行反序列化:

Private Sub Deserialize()
    Dim Jobj = Newtonsoft.Json.JsonConvert.DeserializeObject(Of Response())(Jstring)
End Sub

Public Class Record
    Public Property id As Integer
End Class

Public Class Result
    Public Property records As Record()
    Public Property success As Boolean
End Class

Public Class Response
    Public Property type As String
    Public Property tid As Integer
    Public Property action As String
    Public Property method As String
    Public Property result As Result
End Class

但是然后我丢失了查询返回的成功/失败消息

我应该如何写类结果以colect性能记录作为记录() 更迭为布尔的那些对象为“0”,“1”,等等...?

非常感谢您的帮助。

数据库

您在这里有两个不相关的问题:

  1. 您的Result类由一组固定属性和一组变量属性组成,这些变量属性具有递增的数字名称和值的标准化模式。您想自动反序列化标准属性,以及捕获和反序列化自定义属性。

    可以使用来完成JsonExtensionData使用此属性,您可以暂时将自定义属性反序列化为a,Dictionary(of String, JToken)然后Dictionary(Of String, Success)[OnDeserialized]回调中转换为a Success是一种旨在捕获JSON的类型,如下所示:

    {
      "success": true,
      "successes": [ [ "Task successfuly created with S/N #22920" ] ]
    }
    

    有关文档,请参见反序列化ExtensionData

  2. 在上述Success类型的内部"successes"数组既包含字符串数组,又包含单个字符串。

    如果您successes按以下方式定义属性:

    Public Property successes As List(Of List(Of String))
    

    然后这可以使用的变化来处理SingleOrArrayConverter(Of String)如何处理这两种单个项目和用于使用JSON.net相同的属性的阵列,其设置为项转换器通过<JsonProperty(ItemConverterType := GetType(SingleOrArrayConverter(Of String)))>

因此,您的最终课程将如下所示:

Public Class Success
    Public Property success As Boolean
    <JsonProperty(ItemConverterType := GetType(SingleOrArrayConverter(Of String)))> _   
    Public Property successes As List(Of List(Of String))
End Class

Public Class Record
    Public Property id As Integer
End Class

Public Class Result
    Public Property records As Record()
    Public Property success As Boolean

    <JsonIgnore> _
    Public Property successes as Dictionary(Of string, Success)

    <JsonExtensionData> _
    Private _additionalData as Dictionary(Of string, JToken)

    <System.Runtime.Serialization.OnSerializing> _
    Sub OnSerializing(ByVal context as System.Runtime.Serialization.StreamingContext)
        If successes IsNot Nothing
            _additionalData = successes.ToDictionary(Function(p) p.Key, Function(p) JToken.FromObject(p.Value))
        Else
            _additionalData = Nothing
        End If
    End Sub

    <System.Runtime.Serialization.OnSerialized> _
    Sub OnSerialized(ByVal context as System.Runtime.Serialization.StreamingContext)
        _additionalData = Nothing
    End Sub

    <System.Runtime.Serialization.OnDeserializing> _
    Sub OnDeserializing(ByVal context as System.Runtime.Serialization.StreamingContext)
        _additionalData = Nothing
    End Sub

    <System.Runtime.Serialization.OnDeserialized>
    Sub OnDeserialized(ByVal context as System.Runtime.Serialization.StreamingContext)

        If _additionalData IsNot Nothing
            successes = _additionalData.ToDictionary(Function(p) p.Key, Function(p) p.Value.ToObject(Of Success)())
        End If
        _additionalData = Nothing

    End Sub
End Class

Public Class Response
    Public Property type As String
    Public Property tid As Integer
    Public Property action As String
    Public Property method As String
    Public Property result As Result
End Class

Public Class SingleOrArrayConverter(Of T)
    Inherits JsonConverter

    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

    Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object
        Dim retVal As Object = New List(Of T)()
        If reader.TokenType = JsonToken.StartArray Then
            serializer.Populate(reader, retVal)
        Else
            Dim instance As T = DirectCast(serializer.Deserialize(reader, GetType(T)), T)
            retVal.Add(instance)
        End If
        Return retVal
    End Function

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

End Class

原型小提琴

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

反序列化Json,不带名称Fields and Format字符串,数组

来自分类Dev

反序列化字符串

来自分类Dev

反序列化字符串化的JSON对象

来自分类Dev

反序列化字符串不转换数组

来自分类Dev

根据类型反序列化json字符串

来自分类Dev

反序列化JSON字符串嵌套字典

来自分类Dev

在Android中反序列化JSON字符串

来自分类Dev

如何反序列化JSON字符串以枚举

来自分类Dev

反序列化json表单字符串

来自分类Dev

反序列化json字符串

来自分类Dev

反序列化复杂的动态JSON字符串

来自分类Dev

反序列化Google Financial JSON字符串

来自分类Dev

使该json字符串反序列化的最佳方法是什么?

来自分类Dev

Jackson 反序列化 json 字符串但 bean 缺少 json 字符串的属性/键

来自分类Dev

Json.NET反序列化或序列化json字符串并将属性映射到运行时定义的不同属性名称

来自分类Dev

Json.NET反序列化或序列化json字符串,并将属性映射到运行时定义的不同属性名称

来自分类Dev

Newtosoft Json反序列化:如果/当给定的json字符串具有比必要的属性更多的属性时,如何引发错误?

来自分类Dev

Json.Net 反序列化字符串中的 JSON 字符串

来自分类Dev

将一属性对象的JSON数组反序列化为字符串集合

来自分类Dev

如何反序列化在字符串值中有引号的字符串?

来自分类Dev

C# API 调用:JSON 字符串到类属性(反序列化等)

来自分类Dev

在JSON字符串反序列化期间如何忽略数组项

来自分类Dev

使用嵌套数组反序列化JSON以从值生成字符串

来自分类Dev

JavaScriptSerializer。如何从JSON反序列化字符串数组?

来自分类Dev

Json newtonsoft:从对象反序列化字符串数组

来自分类Dev

JSON字符串化具有属性的对象数组

来自分类Dev

GSON反序列化没有所有字段的json字符串

来自分类Dev

PHP:通过反序列化序列化字符串来制作数组

来自分类Dev

使用 vb 反序列化没有固定 KEY 的 JSON 字符串

Related 相关文章

  1. 1

    反序列化Json,不带名称Fields and Format字符串,数组

  2. 2

    反序列化字符串

  3. 3

    反序列化字符串化的JSON对象

  4. 4

    反序列化字符串不转换数组

  5. 5

    根据类型反序列化json字符串

  6. 6

    反序列化JSON字符串嵌套字典

  7. 7

    在Android中反序列化JSON字符串

  8. 8

    如何反序列化JSON字符串以枚举

  9. 9

    反序列化json表单字符串

  10. 10

    反序列化json字符串

  11. 11

    反序列化复杂的动态JSON字符串

  12. 12

    反序列化Google Financial JSON字符串

  13. 13

    使该json字符串反序列化的最佳方法是什么?

  14. 14

    Jackson 反序列化 json 字符串但 bean 缺少 json 字符串的属性/键

  15. 15

    Json.NET反序列化或序列化json字符串并将属性映射到运行时定义的不同属性名称

  16. 16

    Json.NET反序列化或序列化json字符串,并将属性映射到运行时定义的不同属性名称

  17. 17

    Newtosoft Json反序列化:如果/当给定的json字符串具有比必要的属性更多的属性时,如何引发错误?

  18. 18

    Json.Net 反序列化字符串中的 JSON 字符串

  19. 19

    将一属性对象的JSON数组反序列化为字符串集合

  20. 20

    如何反序列化在字符串值中有引号的字符串?

  21. 21

    C# API 调用:JSON 字符串到类属性(反序列化等)

  22. 22

    在JSON字符串反序列化期间如何忽略数组项

  23. 23

    使用嵌套数组反序列化JSON以从值生成字符串

  24. 24

    JavaScriptSerializer。如何从JSON反序列化字符串数组?

  25. 25

    Json newtonsoft:从对象反序列化字符串数组

  26. 26

    JSON字符串化具有属性的对象数组

  27. 27

    GSON反序列化没有所有字段的json字符串

  28. 28

    PHP:通过反序列化序列化字符串来制作数组

  29. 29

    使用 vb 反序列化没有固定 KEY 的 JSON 字符串

热门标签

归档