簡體   English   中英

如何用Jackson實現動態部分JSON序列化?

[英]How to implement dynamic partial JSON serialization with Jackson?

我有一個POJO,其中包含用於跟蹤屬性是否已顯式設置的所有屬性的自定義setter方法。 setter存儲到fieldNameSet布爾字段,並為這些標志公開isFieldNameSet getter。 我希望Jackson只使用isFieldNameSettrue字段動態地序列化類。

背景:

我開始編寫一個自定義的JsonFilter實現,但它沒有給出當前正在序列化的對象實例的任何上下文,所以顯然我無法讀取isFieldNameSet屬性的當前值。

從傑克遜的例子中快速入侵

import org.codehaus.jackson.JsonGenerationException;
import org.codehaus.jackson.map.JsonMappingException;
import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.ser.FilterProvider;
import org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
import org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;

public class JacksonExample {
    public static void main(String[] args) {

        ObjectMapper mapper = new ObjectMapper();

        User user = createDummyUser();

        try {

            //Its age here , this is conditional based on your fieldset
            SimpleBeanPropertyFilter theFilter = SimpleBeanPropertyFilter.serializeAllExcept("age");
            FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter", theFilter);

            // Convert object to JSON string
            String jsonInString = jsonInString = mapper.writer(filters).writeValueAsString(user);
            System.out.println(jsonInString);

            // Convert object to JSON string and pretty print

            //System.out.println(jsonInString);

        } catch (JsonGenerationException e) {
            e.printStackTrace();
        } catch (JsonMappingException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    private static User createDummyUser() {

        User user = new User();

        user.setName("mkyong");
        user.setAge(33);

        List<String> msg = new ArrayList<>();
        msg.add("hello jackson 1");
        msg.add("hello jackson 2");
        msg.add("hello jackson 3");

        user.setMessages(msg);

        return user;

    }
}


package org.soproject;

import java.util.List;

import org.codehaus.jackson.map.annotate.JsonFilter;

@JsonFilter("myFilter")
public class User {

    private String name;
    private int age;
    private List<String> messages;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public List<String> getMessages() {
        return messages;
    }

    public void setMessages(List<String> messages) {
        this.messages = messages;
    }

    // getters and setters

}

如您所見,忽略年齡:

{“name”:“mkyong”,“messages”:[“hello jackson 1”,“hello jackson 2”,“hello jackson 3”]}

注意傑克遜源來自: https//www.mkyong.com/java/how-to-convert-java-object-to-from-json-jackson/

暫無
暫無

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

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