将JSON反序列化为对象封装列表

时间:2016-12-17 19:34:46

标签: java json jackson

因为在应用程序中将List<String>等原始类型保留在自己的习惯上是一个坏习惯,所以我决定使用以下类封装它:

public class EncapsulatedList {
    @JsonProperty
    private List<String> someWords;
    /*
    Some setters, getters and so on
     */
}

但它被序列化为:

{
  "someWords": [
    "cheese",
    "random cheese",
    "more random cheese"
  ]
}

将它作为一个简单的列表会更好:

[
  "cheese",
  "random cheese",
  "more random cheese"
]

使用Jackson 2是否有一种干净的方法可以实现这一点,而不必像首先反序列化列表并将其放入封装类一样明确地执行此操作?

1 个答案:

答案 0 :(得分:0)

来自@JsonUnwrapped的JavaDoc:

  

另请注意,注释仅适用于

     
      
  • 值被序列化为JSON对象(无法使用此机制解包JSON数组)
  •   

如果您不想直接使用String[]List<String>,则可以自行反序列化该类型,例如:

class EncapsulatedListDeserializer extends StdDeserializer<EncapsulatedList> {
    // ctor omitted
    public EncapsulatedList deserialize(JsonParser p, DeserializationContext ctxt)
            throws IOException, JsonProcessingException {
        JsonNode node = p.getCodec().readTree(p);
        List<String> list = new ArrayList<>();
        if (node.isArray()) {
            for (JsonNode value : node) {
                list.add(value.asText());
            }
        }

        return new EncapsulatedList(list);
    }
}

至少有点抽象反序列化并手动调用setter。