是否需要严格定义JSON值类型?

时间:2018-10-29 22:41:39

标签: java json rest api gson

我遇到了一个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”可以是String或对象或数组的事实。我已经编写了自定义解串器来解析它。 我的问题是,JSON规范是否允许JSON对象具有宽松定义的值类型,这意味着fieldValue类型可以是String,对象数组或对象?

2 个答案:

答案 0 :(得分:2)

JSON specification仅提及JSON对象的语法,没有提及语义。因此,解析器将不会检查给定值应为A还是B类型。它将读取任何可用值,并且如果语法损坏,将报告错误。由您的应用程序来验证内容并做出相应的反应。

答案 1 :(得分:1)

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

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

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