使用多种类型为属性反序列化JSON

时间:2017-06-13 16:40:30

标签: java json jackson retrofit

我正在使用第三方API,它为同一个JSON属性返回三种不同的类型,具体取决于它包含多少个嵌套对象。我试图找出使用Jackson(最好使用Retrofit)处理反序列化这些对象的最佳方法。

简化示例:从此API检索客户记录时,响应可能是以下任何一个:

  1. 客户有多个电话号码;返回PhoneObjects

    数组
    {
        "Phones": {
            "PhoneObject":[
                {"number":"800 555 6666","type":"Home"},
                {"number":"800 555 4444","type":"Work"}
            ]
        }
    }
    
  2. 客户有一个电话号码;返回一个PhoneObject

    {
        "Phones": {
            "PhoneObject": {"number":"800 555 6666","type":"Home"}
        },
    }
    
  3. 客户没有电话号码;返回一个空字符串(!)

    {
        "Phones": {
            "PhoneObject":""
        }
    }
    
  4. 目前,我通过将杰克逊反序列化为Map<String, Object>并检查Object以确定它是什么类型,然后将其插入,例如, a List<PhoneObject>(如果对象不存在,则返回空列表)。然而,这很麻烦,并希望找到一种更清晰的方法来反序列化这些对象。

1 个答案:

答案 0 :(得分:3)

我能够将所有3个JSON字符串解析为此Phones

class Phones {
    @JsonProperty("PhoneObject")
    private List<PhoneObject> phoneObjects;
}

使用此ObjectMapper配置:

ObjectMapper mapper = new ObjectMapper();
mapper.enable(DeserializationFeature.UNWRAP_ROOT_VALUE);
mapper.enable(DeserializationFeature.ACCEPT_SINGLE_VALUE_AS_ARRAY);
mapper.enable(DeserializationFeature.ACCEPT_EMPTY_STRING_AS_NULL_OBJECT);

ACCEPT_SINGLE_VALUE_AS_ARRAY允许将值解析为大小为1的列表。

ACCEPT_EMPTY_STRING_AS_NULL_OBJECT允许将空字符串解析为null。在这种情况下,phoneObjects最终为null。不太理想,但我不知道在这里找到一个空列表的简单方法。

根据您的POJO,您可能需要UNWRAP_ROOT_VALUE,也可能不需要。{/ p>