【问题标题】:Deserialize malformed Json returning empty arrays反序列化返回空数组的格式错误的 Json
【发布时间】:2016-11-23 20:18:48
【问题描述】:

拜托,我使用 VB.NET Http 请求从 web 服务读取数据。它曾经以这种方式发送数据:

[
    {
      "id": 7532,
      "nome": "LABOR INC.",
      "isClient": false,
      "personality": {
        "id": 2,
        "value": "CORPORATION"
      },
      "registryNumbers": [
        {
          "id": 9378,
          "number": "20786790174"
        }
      ],
      "personality_id": 2
    },
    {
      "id": 7537,
      "nome": "JOSE SILVA",
      "isClient": false,
      "personality": {
        "id": 1,
        "value": "PERSON"
      },
      "gender": {
        "id": 1,
        "value": "MALE"
      },
      "cityOfBirth": {
        "id": 355030,
        "value": "SAO PAULO"
      },
      "nationality": {
        "id": 85,
        "value": "BRAZILIAN"
      },
      "registryNumbers": [
        {
          "id": 9383,
          "number": "03217495388"
        }
      ],
      "personality_id": 1
    }
]

没关系,因为省略了未使用的字段(如公司的“性别”和“城市出生”)。然而,从前几天开始,它开始将这些字段作为空数组 ([]) 发回,如下所示:

{
  "id": 7532,
  "nome": "LABOR INC.",
  "isClient": false,
  "personality": {
    "id": 2,
    "value": "CORPORATION"
  },
  "gender": [],
  "cityOfBirth": [],
  "nationality": [],
  "registryNumbers": [
    {
      "id": 9378,
      "number": "20786790174"
    }
  ],
  "personality_id": 2
}

因此它不适合反序列化类中的命运属性,因为这些不是(也不能是)枚举/数组,而是单个对象。

我的问题:是否有一些反序列化扩展或属性可以添加到我的类中,以便将那些 ([]) 反序列化为 null/Nothing?特别感谢它来自 VB.NET,但我也能够阅读和适应 C#。

也就是说,我想知道当一个数组被“强制”为一个需要单个对象的属性时,我如何让我的代码停止,并在这一点上进行适当的处​​理。

【问题讨论】:

  • 这不是“格式错误的 json”。这是完全有效的。是你的结构无法处理它。如果没有可以覆盖内部反序列化的东西,则解码为临时结构,摆弄它以将空数组更改为您想要的任何内容,然后将其提供给您的代码。
  • 谢谢,@MarcB。你的意思是[] 也是 JSON 中表示空值的方式吗?
  • 没有。 [] 是一个空数组。那不是空的。 json 中的 null(实际上只是 javascript)是字面意思 null。如果您可以 100%SURE 确保[] 永远不会出现在 json 中的其他任何位置,那么您可以在解码之前对 json 进行简单的[] -> null 字符串替换。
  • 那么它格式错误的,因为这些属性将携带单个对象,而不是数组。它可能不是无效的 JSON 语法,但与他们使用的对象模型模式不一致。这就是我所说的“畸形”的意思,如果表达不当,请见谅。
  • 那么也许去看看是什么生成了 json。如果它正在输出(出于您的目的)“垃圾”,那么最好修复生成 json 的内容,而不是尝试清理“垃圾”。如果这是 api 中已发布的更改,那么您将不得不调整您的代码。

标签: arrays json vb.net deserialization malformed


【解决方案1】:

尝试使用自定义转换器解决了问题:

Public Class BogusArrayJsonConverter
    Inherits JsonConverter
    Public Overrides Function CanConvert(objectType As Type) As Boolean
        Return GetType(MyRecord).IsAssignableFrom(objectType)
    End Function
    Public Overrides Function ReadJson(reader As JsonReader, objectType As Type, existingValue As Object, serializer As JsonSerializer) As Object
        If reader.TokenType = JsonToken.StartArray Then
            Return serializer.Deserialize(Of MyRecord())(reader).SingleOrDefault
        Else
            Return serializer.Deserialize(Of MyRecord)(reader)
        End If
    End Function
    Public Overrides Sub WriteJson(writer As JsonWriter, value As Object, serializer As JsonSerializer)
        Throw New NotImplementedException()
    End Sub
End Class

感谢所有试图帮助我的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多