日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Jackson动态处理返回字段

發布時間:2023/12/20 编程问答 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Jackson动态处理返回字段 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

有時候業務需要動態返回字段,比如,

場景一:返回 name , birthday, createDate

場景二:返回name, birthday, age

現做個備忘錄,以便參考。

下面是引入的POM

<dependency>
??? <groupId>com.fasterxml.jackson.core</groupId>
??? <artifactId>jackson-core</artifactId>
??? <version>2.9.8</version>
</dependency>

?

創建 JacksonJson過濾器類,代碼如下:


@JsonFilter("JacksonFilter")
public class JacksonJsonFilter extends FilterProvider{

??? Map<Class<?>, Set<String>> includeMap = new HashMap<>();
??? Map<Class<?>, Set<String>> filterMap = new HashMap<>();

??? public void include(Class<?> type, String[] fields) {
??????? addToMap(includeMap, type, fields);
??? }

??? public void filter(Class<?> type, String[] fields) {
??????? addToMap(filterMap, type, fields);
??? }
?? ?
??? private void addToMap(Map<Class<?>, Set<String>> map, Class<?> type, String[] fields) {
??????? Set<String> filedSet=new HashSet<>();
??????? if(fields!=null && fields.length>0){
??????????? for(String filed : fields){
??????????????? filedSet.add(filed);
??????????? }
??????? }
??????? map.put(type, filedSet);
??? }

??? @Override
??? public BeanPropertyFilter findFilter(Object filterId) {
??????? throw new UnsupportedOperationException("Access to deprecated filters not supported");
??? }

??? @Override
??? public PropertyFilter findPropertyFilter(Object filterId, Object valueToFilter) {

??????? return new SimpleBeanPropertyFilter() {

??????????? @Override
??????????? public void serializeAsField(Object pojo, JsonGenerator jgen, SerializerProvider prov, PropertyWriter writer)
??????????????????? throws Exception {
??????????????? if (apply(pojo.getClass(), writer.getName())) {
??????????????????? writer.serializeAsField(pojo, jgen, prov);
??????????????? } else if (!jgen.canOmitFields()) {
??????????????????? writer.serializeAsOmittedField(pojo, jgen, prov);
??????????????? }
??????????? }
??????? };
??? }

??? public boolean apply(Class<?> type, String name) {
??????? Set<String> includeFields = includeMap.get(type);
??????? Set<String> filterFields = filterMap.get(type);
??????? if (includeFields != null && includeFields.contains(name)) {
??????????? return true;
??????? } else if (filterFields != null && !filterFields.contains(name)) {
??????????? return true;
??????? } else if (includeFields == null && filterFields == null) {
??????????? return true;
??????? }
??????? return false;
??? }

}

?

寫個Util工具類

public class JsonWareUtil {

??? private static ObjectMapper objectMapper = null;

??? private static JacksonJsonFilter jacksonFilter = new JacksonJsonFilter();
?? ?
?? ?static {
?? ??? ?if(objectMapper==null){
?? ??? ??? ?? objectMapper = new ObjectMapper();

// 允許對象忽略json中不存在的屬性objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);// 允許出現特殊字符和轉義符 objectMapper.configure(Feature.ALLOW_UNQUOTED_CONTROL_CHARS, true); // 允許出現單引號 objectMapper.configure(Feature.ALLOW_SINGLE_QUOTES, true); // 忽視為空的屬性 objectMapper.setSerializationInclusion(Include.NON_EMPTY);

?? ??? }

public static void filter(Class<?> clazz, String include, String filter) {if (clazz == null) return; if (StringUtils.isNotBlank(include)) { jacksonFilter.include(clazz, include.split(",")); } if (StringUtils.isNotBlank(filter)) { jacksonFilter.filter(clazz, filter.split(",")); } objectMapper.addMixIn(clazz, jacksonFilter.getClass()); }

?

??? /**
?? ? * @param obj 被轉對象
?? ? * @return JSON串
?? ? * 將對象轉JSON字符串
?? ? */
?? ?public static String beanToJson(Object obj) {
?? ??? ?try {

??????????? objectMapper.setFilterProvider(jacksonFilter);
?? ??? ??? ?String jsonString = objectMapper.writeValueAsString(obj);
?? ??? ??? ?return jsonString;
?? ??? ?} catch (Exception e) {
?? ??? ??? ?e.printStackTrace();
?? ??? ??? ?return null;
?? ??? ?}
?? ?}

?

...

下面省略其他封裝的JSON操作方法。

}

?

使用:

public class Test {

???? public static void mian(String[] args) {

????????? // fields: name , birthday, createDate, age

????????? A a = new A();

????????? a.setName("test1");
????????? a.setBirthday("xxxx-xx-xx");

????????? a.setCreateDate("2019-05-12 12:22:21");

????????? a.setAge(16);

?

? ? ? ? ??JsonWareUtil.filter(A.getClass(), "name, birthday", null);

????????? String json = JsonWareUtil.beanToJson(a);

????????? System.out.println(json);

???? }

}

?

轉載于:https://www.cnblogs.com/jimmyshan-study/p/10882507.html

創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的Jackson动态处理返回字段的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。