簡體   English   中英

用Java創建Jackson JSON

[英]Create Jackson JSON in Java

我是傑克遜的初學者。 如何使用Java創建這樣的JSON消息?

{
    "name": "John",
    "age": "40",
    "family": {
        "parents_name": [
            "David",
            "Susan"
        ],
        "children": "yes",
        "children_names": [
            "Peter",
            "Mary"
        ]
    }
}

對於初學者而言,最簡單的方法是消除不必要的嵌套,並依靠Jackson的默認對象綁定。

您將創建一個這樣的類:

public class Person {
    private String name;
    private int age;
    private List<String> parentNames;
    private List<String> childrenNames;

    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> getParentNames() {
        return parentNames;
    }

    public void setParentNames(List<String> parentNames) {
        this.parentNames = parentNames;
    }

    public List<String> getChildrenNames() {
        return childrenNames;
    }

    public void setChildrenNames(List<String> childrenNames) {
        this.childrenNames = childrenNames;
    }
}

然后,您可以像這樣從JSON實例化一個Person

Person p = ObjectMapper.readValue(jsonString, Person.class);

請注意,由於以下三個原因,示例中的JSON無法與此對象一起使用:

  • Person類沒有Family對象。 我覺得這增加了不必要的復雜性。 如果需要,創建一個單獨的Family類, Person將包含一個Family成員(無雙關語)。
  • 我沒有為children的布爾值,因為可以從childrenNames列表的長度中得出。
  • JSON將需要具有childrenNamesparentNames而不是children_namesparents_name 如果需要這些,請在這些值的getter和setter上添加具有所需屬性名稱的@JsonProperty

用Java創建一個Person類,該類具有諸如getName(),getAge()等屬性。 然后Jackson可以從您的Person對象自動為您創建該JSON。

從您的評論到Vidya的解決方案,我發現您所尋求的靈活性比默認綁定要多。

Jackson允許您創建自己的自定義序列化程序。 例如:

public class Person {
    private String name;
    private int age;
    private List<String> parentsName;
    private List<String> childrenNames;

    public Person(String name, List<String> parentsName) {
        this(name, parentsName, -1, Collections.<String>emptyList());
    }

    public Person(String name, List<String> parentsName, int age) {
        this(name, parentsName, age, Collections.<String>emptyList());
    }

    public Person(String name, List<String> parentsName, int age, List<String> childrenNames) {
        this.name = name;
        this.age = age;
        this.parentsName = parentsName;
        this.childrenNames = childrenNames;
    }

    private void serialize(JsonGenerator generator, SerializerProvider arg2) throws IOException {
        generator.writeStartObject();

        generator.writeObjectField("name", name);

        if (age >= 0)
            generator.writeNumberField("age", age);

        // start family subset
        generator.writeObjectFieldStart("family");

        generator.writeArrayFieldStart("parents_name");
        for (String parent : parentsName) { 
            generator.writeObject(parent);
        }
        generator.writeEndArray();

        generator.writeObjectField("children", (childrenNames.isEmpty() ? "no" : "yes"));

        generator.writeArrayFieldStart("children_names");

        for (String child : childrenNames) {
            generator.writeObject(child);
        }
        generator.writeEndArray();

        generator.writeEndObject();
        // end family subset

        generator.writeEndObject();
    }

    public static JsonSerializer<Person> createJsonSerializer() { 
        return new JsonSerializer<Person>() {
            @Override
            public void serialize(Person me, JsonGenerator generator, SerializerProvider arg2) throws IOException, JsonProcessingException {
                me.serialize(generator, arg2);
            }            
        };
    }

    public static void main(String[] args) throws IOException {
        List<String> parentsName = Arrays.<String>asList("David", "Susan");
        List<String> childrenNames = Arrays.<String>asList("Peter", "Mary");
        Person person = new Person("John", parentsName, 40, childrenNames);

        ObjectMapper mapper = new ObjectMapper();
        SimpleModule simpleModule = new SimpleModule("PersonModule", new Version(1, 0, 0, null));
        simpleModule.addSerializer(Person.class, Person.createJsonSerializer());

        // pretty output for debugging
        mapper.configure(SerializationConfig.Feature.INDENT_OUTPUT, true); 
        mapper.registerModule(simpleModule);

        System.out.println("Person json: ");
        System.out.println(mapper.writeValueAsString(person));

    }
}

這樣可以通過兩種方式提高靈活性:

  • 您可以在序列化中應用條件邏輯

  • 您可以有多個自定義序列化程序

缺點很明顯

  • 更復雜

  • 實施時間更多。 默認綁定幾乎是免費的。 這個解決方案不是。

暫無
暫無

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

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