簡體   English   中英

將JSON反序列化為對象封裝列表

[英]Deserialize JSON to object encapsulating list

由於將諸如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來實現此目的,而不必像先反序列化列表並將其放入封裝類那樣顯式地執行此操作?

@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。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM