【发布时间】: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