簡體   English   中英

傑克遜反序列化-匯總多個字段

[英]Jackson deserialization - aggregate several fields

假設我有一組在JSON中定義的人。

{
        "NOM": "Doe",
        "PRENOM": "John",
        "EMAIL": "john.doe@email.me",
        "VILLE": "Somewhere",
        "LIKE1": "Lolcats",
        "LIKE2": "Loldogs",
        "LIKE3": "Lolwut",
        "HATE1": "Bad stuff",
        "HATE2": "Bad bad stuff"
}

是否可以編寫一個JsonDeserializer來將LIKE *和HATE *字段聚合並將其轉換為喜歡的集合,並設置為Person的屬性? (請注意,只有LIKE1,LIKE2,LIKE3,HATE1,HATE2。)

最終結果屬性將類似於:

public class Person {
    private final String lastName;
    private final String firstName;
    private final String email;
    private final String town;
    private final Collection<Liking> likings;
    // c-tor, getters
}

我已經有了可以將給定的LIKE * / HATE *屬性反序列化為Liking對象的邏輯,但是我無法理解如何將它們聚合並將其添加到Person喜歡的屬性。

提前謝謝!

我很確定您無法按照您的意願進行操作,如何做到這一點:

{
        "NOM": "Doe",
        "PRENOM": "John",
        "EMAIL": "john.doe@email.me",
        "VILLE": "Somewhere",
        "likings": ["Lolcats", "Loldogs", "LIKE3": "Lolwut", "Bad stuff", "Bad bad stuff" ]
}

如果您有一些代碼可以證明自己開始解決此問題,那就太好了。 但是,這是一個示例自定義解串器,幾乎可以滿足您的需求:

class PersonDeserializer extends JsonDeserializer<Person> {

    @Override
    public Person deserialize(final JsonParser parser,
            final DeserializationContext content) throws IOException,
            JsonProcessingException {

        final ObjectCodec codec = parser.getCodec();
        final JsonNode node = codec.readTree(parser);

        final Person person = new Person();
        final Iterator<String> fieldNameIter = node.getFieldNames();
        while (fieldNameIter.hasNext()) {
            final String fieldName = fieldNameIter.next();
            if (fieldName.equalsIgnoreCase("EMAIL")) {
                person.setEmail(node.get(fieldName).getTextValue());
            } else if (fieldName.equalsIgnoreCase("NOM")) {
                person.setFirstName(node.get(fieldName).getTextValue());
            } else if (fieldName.equalsIgnoreCase("PRENOM")) {
                person.setLastName(node.get(fieldName).getTextValue());
            } else if (fieldName.equalsIgnoreCase("VILLE")) {
                person.setTown(node.get(fieldName).getTextValue());
            } else if (fieldName.startsWith("LIKE")) {
                person.addLike(Liking.LikingType.LIKE, node.get(fieldName)
                        .getTextValue());
            } else if (fieldName.startsWith("HATE")) {
                person.addLike(Liking.LikingType.HATE, node.get(fieldName)
                        .getTextValue());
            }
        }

        return person;
    }
}

它假定一個類似於以下內容的Liking對象:

public class Liking {
    public static enum LikingType {
        LIKE, HATE;
    }

    private LikingType type;

    private String value;

    // Constructors, getters/setters
}

我認為您可以對Person對象進行一些更改。 如果打算以相同的自定義格式將對象序列化為JSON,則必須編寫相應的JsonSerializer

另一個選項(不是那么健壯)是太簡單地使用地圖按原樣存儲喜歡和不喜歡的東西。 此解決方案將忽略任何有關喜好/不喜歡的顯式映射,並利用@JsonAny批注捕獲它們。 在此方案中,Person對象將如下所示:

public class Person {
    private String lastName;
    private String firstName;
    private String email;
    private String town;
    @JsonAny
    private Map<String, Object> otherProperties;

    // Constructors, getters/setters
}

將您的JSON反序列化為此修改版的Person會將所有無法識別的屬性作為鍵值對放置到哈希圖中。

暫無
暫無

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

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