【问题标题】:Does JSON value type need to be strictly defined? [duplicate]JSON值类型是否需要严格定义? [复制]
【发布时间】:2019-04-02 22:36:52
【问题描述】:

我遇到了一个 API,它为“fieldValue”返回不同类型的值,如下所示:

{
    "id" : 123,
    "fieldType" : "text",
    "fieldValue" : "some test"
}
{
    "id" : 456,
    "fieldType" : "checkbox",
    "fieldValue" : 
    [
        {
            "checkboxId" : 1,
            "name" : "Homer"
        },
        {
            "checkboxId" : 2, 
            "name" : "Marge"
        }
    ]
}
{
    "id" : 789,
    "fieldType" : "Select",
    "fieldValue" : {
        "selectId" : 3,
        "value" : "Lisa"
    }
}

我正在使用 GSON,它不喜欢“fieldValue”可以是字符串、对象或数组的事实。我已经编写了自定义反序列化器来解析它。 我的问题是 JSON 规范是否允许 JSON 对象具有松散定义的值类型,这意味着 fieldValue 类型可以是字符串、对象数组还是对象?

【问题讨论】:

  • 字段类型没有说明符。实际值可以是任何需要的值。阅读 API 以了解类型可以是什么并相应地编写解析器。
  • JSON specification: 右侧的类型没有任何限制。

标签: java json rest api gson


【解决方案1】:

JSON specification 只提到 JSON 对象的语法,而不是语义。所以解析器不会检查给定的值是 A 还是 B 类型。它会读取任何可用的值,如果语法被破坏,它将报告错误。由您的应用程序来验证内容并做出相应的反应。

【讨论】:

    【解决方案2】:

    不,有时它甚至不是一个好政策。 JSON 规范本身并没有说明 JSON 中呈现的对象是什么。这是 API 规范的责任。

    您拥有的 API 似乎依赖于鉴别器字段 fieldType,我猜您正在使用它来进行自定义反序列化。

    这也是RuntimeTypeAdapterFactory 使用的策略,在您的情况下也可能是很好的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-06-17
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      • 2015-11-25
      • 2022-01-14
      • 2014-08-14
      相关资源
      最近更新 更多