[英]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
列表的長度中得出。 childrenNames
和parentNames
而不是children_names
和parents_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.