如何对Contact类对象执行Selective marshalling?仅输出address字段的简便方法
嘿,这个问题我太熟了!要实现选择性编组只输出特定字段,不同的序列化框架有不同的简便方案,我就拿你的Contact类来举几个最常用的例子:
方法1:用JAXB实现选择性XML编组
如果是做XML格式的编组(Java标准的JAXB方式),有两种超简单的写法:
假设你的基础Contact类是这样的:
public class Contact { private String name; private String phone; private String address; // 构造器、getter、setter省略 }
- 方式A:给不需要输出的字段加忽略注解
直接给name和phone加上@XmlTransient注解,告诉JAXB跳过这些字段:
public class Contact { @XmlTransient private String name; @XmlTransient private String phone; private String address; // 构造器、getter、setter省略 }
这样编组后生成的XML就只会包含address字段。
- 方式B:只标记需要输出的字段
在类上加上@XmlAccessorType(XmlAccessType.NONE),表示默认不序列化任何字段,然后给需要输出的address加@XmlElement注解:
@XmlAccessorType(XmlAccessType.NONE) public class Contact { private String name; private String phone; @XmlElement private String address; // 构造器、getter、setter省略 }
这种方式更适合需要输出的字段很少的场景,直接精准标记即可。
方法2:用Jackson实现选择性JSON编组
如果是做JSON序列化(现在更常用的场景),同样有几种简便方法:
- 方式A:单个字段加忽略注解
给不需要输出的name和phone加@JsonIgnore注解:
public class Contact { @JsonIgnore private String name; @JsonIgnore private String phone; private String address; // 构造器、getter、setter省略 }
序列化后得到的JSON就只有address这一个字段。
- 方式B:类上批量指定忽略字段
如果要忽略的字段比较多,直接在类上用@JsonIgnoreProperties一次性指定:
@JsonIgnoreProperties({"name", "phone"}) public class Contact { private String name; private String phone; private String address; // 构造器、getter、setter省略 }
这种写法更清爽,不用给每个字段单独加注解。
扩展:动态选择性编组(适合多场景切换)
如果你的需求是有时候要输出不同的字段组合,不想每次修改实体类注解,可以用Jackson的动态过滤功能:
- 先给Contact类加一个过滤器标记:
@JsonFilter("contactFilter") public class Contact { private String name; private String phone; private String address; // 构造器、getter、setter省略 }
- 序列化时指定要保留的字段:
ObjectMapper mapper = new ObjectMapper(); FilterProvider filters = new SimpleFilterProvider() .addFilter("contactFilter", SimpleBeanPropertyFilter.filterOutAllExcept("address")); String json = mapper.writer(filters).writeValueAsString(contact);
这样就能动态只输出address字段,不用改动实体类,适合灵活切换输出字段的场景。
总之,这些都是非常简便的实现方式,你可以根据自己使用的序列化框架来选择对应的方案~
内容的提问来源于stack exchange,提问作者cestlavie
相关产品推荐
相关产品推荐

