[英]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.