反序列化可在相同属性名称下包含不同对象的JSON

VBobCat

我正在使用JSON.NET来反序列化来自HTTP查询的JSON响应,但是我遇到了一个问题。这是因为响应可以在相同属性下发送两种类型的对象,如下所示:

第一种情况样本(最常见):

{
  "type": "myType",
  "tid": 4,
  "action": "myAction",
  "method": "myMethod",
  "result": {
    "success": true,
    "total": 4,
    "records": [
      {
        "id": 4,
        "nome": "PRIMEIRO NOME",
        "sigla": "PN"
      },
      {
        "id": 1974,
        "nome": "SEGUNDO NOME",
        "sigla": "SN"
      },
      {
        "id": 2584,
        "nome": "TERCEIRO NOME",
        "sigla": "TN"
      },
      {
        "id": 1170,
        "nome": "QUARTO NOME",
        "sigla": "QN"
      }
    ]
  }
}

第二例样品(稀有):

{
  "type": "myType",
  "tid": 3,
  "action": "myAction",
  "method": "myMethod",
  "result": [
    {
      "id": 4,
      "nome": "PRIMEIRO NOME",
      "sigla": "PN"
    },
    {
      "id": 1974,
      "nome": "SEGUNDO NOME",
      "sigla": "SN"
    },
    {
      "id": 2584,
      "nome": "TERCEIRO NOME",
      "sigla": "TN"
    },
    {
      "id": 1170,
      "nome": "QUARTO NOME",
      "sigla": "QN"
    }
  ]
}

我一直在使用这些类来接收第一种情况的数据:

Public Class Record
    Public Property id As Integer
    Public Property nome As String
    Public Property sigla As String
End Class

Public Class Result
    Public Property success As Boolean
    Public Property total As Integer
    Public Property records As Record()
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

因此,在使用以下语句对第一种情况JSON反序列化时,它可以很好地工作:

Dim myResponse = JsonConvert.DeserializeObject(Of Response)(myJsonString)

但是,当接收第二种情况JSON时,它将创建类型为Response的对象,在其属性结果中存储类型为Result的对象,该对象的属性保持为空,并且我需要为其检索的数据也消失了。

我认为我应该修改Response类,以便通过以下方式为不同的数据集放置位置:

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
    Public Property resultRecords As Record()
End Class

那么,问题是:我该如何告诉JsonConvert是将数据存储在适合其类型的属性Response.result中(上面的第一个示例),还是将响应存储Response.resultRecords中?

谢谢!

布莱恩·罗杰斯(Brian Rogers)

由于JSON的格式对于同一属性可能有所不同,因此您将需要一个自定义样式JsonConverter来处理它。转换器可以读取受影响属性的JSON,确定其格式,然后适当地填充您的对象。这是您需要的代码:

Public Class ResultConverter
    Inherits JsonConverter

    Public Overrides Function CanConvert(objectType As Type) As Boolean
        Return objectType = GetType(Result)
    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)
        Dim result As Result = New Result
        If token.Type = JTokenType.Array Then
            result.records = token.ToObject(Of Record())(serializer)
            result.total = result.records.Length
            result.success = True
        Else
            serializer.Populate(token.CreateReader(), result)
        End If
        Return result
    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

要使用转换器,请<JsonConverter>result属性中添加一个属性Response

Public Class Response
    Public Property type As String
    Public Property tid As Integer
    Public Property action As String
    Public Property method As String
    <JsonConverter(GetType(ResultConverter))>
    Public Property result As Result
End Class

这是一个有用的小提琴,它表明此转换器将允许将两种JSON格式反序列化为相同的类:https : //dotnetfiddle.net/NFbQ2Q

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

具有不同属性的相同属性名称的Json反序列化

来自分类Dev

是否可以反序列化和序列化具有不同属性名称的json对象?

来自分类Dev

反序列化具有不同属性的 JSON

来自分类Dev

C#JSON-序列化具有相同属性的不同类型的多个对象

来自分类Dev

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

来自分类Dev

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

来自分类Dev

Json.net用不同的名称反序列化相同的对象

来自分类Dev

Json.net用不同的名称反序列化相同的对象

来自分类Dev

反序列化不同对象的列表

来自分类Dev

反序列化不同对象类型的数组

来自分类Dev

XML反序列化不同对象C#

来自分类Dev

序列化具有相同名称但不同属性的2个属性

来自分类Dev

序列化/反序列化不同的属性名称?

来自分类Dev

为每个键值反序列化具有不同对象类型的JSON文件

来自分类Dev

在Jackson中反序列化具有相同名称但类型不同的属性?

来自分类Dev

从不同元素中反序列化具有相同名称的xml属性

来自分类Dev

反序列化具有不同名称的属性?

来自分类Dev

反序列化具有相同属性的xml元素

来自分类Dev

无法使用 jackson 反序列化包含 2 个具有相同 ID 的对象的 Json

来自分类Dev

在响应中缺少属性名称的情况下反序列化JSON

来自分类Dev

如何使用非标准(和不同的)属性名称反序列化JSON(在.NET中)

来自分类Dev

反序列化包含不同类型对象的JSON数组

来自分类Dev

反序列化具有不同结构和名称的json对象

来自分类Dev

使用Jackson反序列化包装在具有未知属性名称的对象中的JSON

来自分类Dev

在属性名称中使用点反序列化JSON

来自分类Dev

在属性名称中使用$反序列化JSON

来自分类Dev

没有属性名称的json反序列化数组

来自分类Dev

包含XML的JSON.Net反序列化对象

来自分类Dev

使用未知对象名称反序列化JSON

Related 相关文章

  1. 1

    具有不同属性的相同属性名称的Json反序列化

  2. 2

    是否可以反序列化和序列化具有不同属性名称的json对象?

  3. 3

    反序列化具有不同属性的 JSON

  4. 4

    C#JSON-序列化具有相同属性的不同类型的多个对象

  5. 5

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

  6. 6

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

  7. 7

    Json.net用不同的名称反序列化相同的对象

  8. 8

    Json.net用不同的名称反序列化相同的对象

  9. 9

    反序列化不同对象的列表

  10. 10

    反序列化不同对象类型的数组

  11. 11

    XML反序列化不同对象C#

  12. 12

    序列化具有相同名称但不同属性的2个属性

  13. 13

    序列化/反序列化不同的属性名称?

  14. 14

    为每个键值反序列化具有不同对象类型的JSON文件

  15. 15

    在Jackson中反序列化具有相同名称但类型不同的属性?

  16. 16

    从不同元素中反序列化具有相同名称的xml属性

  17. 17

    反序列化具有不同名称的属性?

  18. 18

    反序列化具有相同属性的xml元素

  19. 19

    无法使用 jackson 反序列化包含 2 个具有相同 ID 的对象的 Json

  20. 20

    在响应中缺少属性名称的情况下反序列化JSON

  21. 21

    如何使用非标准(和不同的)属性名称反序列化JSON(在.NET中)

  22. 22

    反序列化包含不同类型对象的JSON数组

  23. 23

    反序列化具有不同结构和名称的json对象

  24. 24

    使用Jackson反序列化包装在具有未知属性名称的对象中的JSON

  25. 25

    在属性名称中使用点反序列化JSON

  26. 26

    在属性名称中使用$反序列化JSON

  27. 27

    没有属性名称的json反序列化数组

  28. 28

    包含XML的JSON.Net反序列化对象

  29. 29

    使用未知对象名称反序列化JSON

热门标签

归档