Java 如何使用Jackson实现动态部分JSON序列化?
我有一个POJO,用于跟踪是否显式设置属性的所有属性的自定义setter方法。setter存储到Java 如何使用Jackson实现动态部分JSON序列化?,java,json,jackson,Java,Json,Jackson,我有一个POJO,用于跟踪是否显式设置属性的所有属性的自定义setter方法。setter存储到fieldNameSet布尔字段,并为这些标志公开isFieldNameSetgetter我希望Jackson仅使用那些具有isFieldNameSet为true的字段动态序列化类 背景: 我开始编写一个自定义的JsonFilter实现,但它没有给出任何关于当前正在序列化的对象实例的上下文,因此显然我无法读取isFieldNameSet属性的当前值。很快就从一个Jackson示例中被破解了 impor
fieldNameSet
布尔字段,并为这些标志公开isFieldNameSet
getter我希望Jackson仅使用那些具有isFieldNameSet
为true
的字段动态序列化类
背景:
我开始编写一个自定义的
JsonFilter
实现,但它没有给出任何关于当前正在序列化的对象实例的上下文,因此显然我无法读取isFieldNameSet
属性的当前值。很快就从一个Jackson示例中被破解了
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
}
import org.codehaus.jackson.jsongGenerationException;
导入org.codehaus.jackson.map.JsonMappingException;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.map.ser.FilterProvider;
导入org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
导入org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
公共类Jacksone示例{
公共静态void main(字符串[]args){
ObjectMapper mapper=新的ObjectMapper();
User User=createDummyUser();
试一试{
//它的年龄在这里,这是有条件的根据您的字段集
SimpleBeanPropertyFilter过滤器=SimpleBeanPropertyFilter.serializeAllExcept(“年龄”);
FilterProviderFilters=新的SimpleFilterProvider().addFilter(“myFilter”,过滤器);
//将对象转换为JSON字符串
字符串jsonInString=jsonInString=mapper.writer(过滤器).writeValueAsString(用户);
System.out.println(jsonInString);
//将对象转换为JSON字符串并打印
//System.out.println(jsonInString);
}捕获(JsonGenerationException e){
e、 printStackTrace();
}捕获(JsonMappingException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有静态用户createDummyUser(){
用户=新用户();
user.setName(“mkyong”);
用户设置(33);
List msg=new ArrayList();
msg.add(“hello jackson 1”);
msg.add(“hello jackson 2”);
msg.add(“hello jackson 3”);
user.setMessages(msg);
返回用户;
}
}
包org.soproject;
导入java.util.List;
导入org.codehaus.jackson.map.annotate.JsonFilter;
@JsonFilter(“myFilter”)
公共类用户{
私有字符串名称;
私人互联网;
私人列表消息;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共列表getMessages(){
返回消息;
}
公共消息(列出消息){
this.messages=消息;
}
//接球手和接球手
}
忽略您看到的年龄:
{“姓名”:“mkyong”,“信息”:[“你好,杰克逊1”,“你好,杰克逊2”,“你好,杰克逊3”]}
注意:jackson的来源是:从一个jackson的例子中快速入侵
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
}
import org.codehaus.jackson.jsongGenerationException;
导入org.codehaus.jackson.map.JsonMappingException;
导入org.codehaus.jackson.map.ObjectMapper;
导入org.codehaus.jackson.map.ser.FilterProvider;
导入org.codehaus.jackson.map.ser.impl.SimpleBeanPropertyFilter;
导入org.codehaus.jackson.map.ser.impl.SimpleFilterProvider;
公共类Jacksone示例{
公共静态void main(字符串[]args){
ObjectMapper mapper=新的ObjectMapper();
User User=createDummyUser();
试一试{
//它的年龄在这里,这是有条件的根据您的字段集
SimpleBeanPropertyFilter过滤器=SimpleBeanPropertyFilter.serializeAllExcept(“年龄”);
FilterProviderFilters=新的SimpleFilterProvider().addFilter(“myFilter”,过滤器);
//将对象转换为JSON字符串
字符串jsonInString=jsonInString=mapper.writer(过滤器).writeValueAsString(用户);
System.out.println(jsonInString);
//将对象转换为JSON字符串并打印
//System.out.println(jsonInString);
}捕获(JsonGenerationException e){
e、 printStackTrace();
}捕获(JsonMappingException e){
e、 printStackTrace();
}捕获(IOE异常){
e、 printStackTrace();
}
}
私有静态用户createDummyUser(){
用户=新用户();
user.setName(“mkyong”);
用户设置(33);
List msg=new ArrayList();
msg.add(“hello jackson 1”);
msg.add(“hello jackson 2”);
msg.add(“hello jackson 3”);
user.setMessages(msg);
返回用户;
}
}
包org.soproject;
导入java.util.List;
导入org.codehaus.jackson.map.annotate.JsonFilter;
@JsonFilter(“myFilter”)
公共类用户{
私有字符串名称;
私人互联网;
私人列表消息;
公共字符串getName(){
返回名称;
}
公共void集合名(字符串名){
this.name=名称;
}
公共整数getAge(){
回归年龄;
}
公共无效设置(整数){
这个。年龄=年龄;
}
公共列表getMessages(){
返回消息;
}
公共消息(列出消息){
this.messages=消息;
}
//接球手和接球手
}
忽略您看到的年龄:
{“姓名”:“mkyong”,“信息”:[“你好,杰克逊1”,“你好,杰克逊2”,“你好,杰克逊3”]}
注:杰克逊的资料来源是: