springboot返回JSON结果下划线

返回json对象需要是下划线来区分前后端

一共两个类

过滤或者包含类

package com.xxx.utils.json;

import com.fasterxml.jackson.annotation.JsonFilter;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import com.fasterxml.jackson.databind.ser.BeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.PropertyFilter;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;

import java.util.*;

import com.fasterxml.jackson.databind.ser.BeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.FilterProvider;
import com.fasterxml.jackson.databind.ser.PropertyWriter;
import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;
import com.fasterxml.jackson.databind.ser.std.BeanSerializerBase;
import com.fasterxml.jackson.databind.ser.std.StdSerializer;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.databind.SerializerProvider;
import java.io.IOException;
import java.util.*;

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

    private final Map<Class<?>, Set<String>> includeMap = new HashMap<>();
    private final 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) {
        if (fields != null && fields.length > 0) {
            Set<String> fieldSet = map.computeIfAbsent(type, k -> new HashSet<>());
            fieldSet.addAll(Arrays.asList(fields));
        }
    }

    @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);

        return (includeFields == null || includeFields.contains(name)) &&
                (filterFields == null || !filterFields.contains(name));
    }
}

实际使用工具类

package com.xxx.utils.json;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonGenerator;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonSerializer;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializerProvider;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

import java.io.*;
import java.util.Set;

/**
* JSON的驼峰和下划线互转帮助类
 * @author yql
 */

public class JsonUtils {

	private static final char UNDERLINE = '_';

	/**
	 *
	 * @param clazz  需求处理字段的源class对象
	 * @param object 最后返回的结果
	 * @param array 需要过滤/包含的字段名称
	 * @param useInclude true是包含,false是过滤
	 * @param <T>
	 * @return
	 * @throws JsonProcessingException
	 */
	public static <T> Object toUnderlineJsonString(Class<T> clazz, Object object, String[] array, boolean useInclude)  {
		ObjectMapper mapper = new ObjectMapper();
		mapper.getSerializerProvider().setNullValueSerializer(new JsonSerializer<Object>() {
			@Override
			public void serialize(Object arg0, JsonGenerator arg1, SerializerProvider arg2) throws IOException, JsonProcessingException {
				arg1.writeString("");
			}
		});
		JacksonJsonFilter jacksonFilter = new JacksonJsonFilter();
		if (useInclude) {
			jacksonFilter.include(clazz, array);
		} else {
			jacksonFilter.filter(clazz, array);
		}
		mapper.setFilterProvider(jacksonFilter);
		mapper.addMixIn(clazz, jacksonFilter.getClass());
		String json = null;
		try {
			json = mapper.writeValueAsString(object);
		} catch (JsonProcessingException e) {
			e.printStackTrace();
			throw new RuntimeException("返回结果转换异常");
		}
		return convert(json);
	}

	private static void convert(Object json) {
		if (json instanceof JSONArray) {
			JSONArray arr = (JSONArray) json;
			for (Object obj : arr) {
				convert(obj);
			}
		} else if (json instanceof JSONObject) {
			JSONObject jo = (JSONObject) json;
			Set<String> keys = jo.keySet();
			String[] array = keys.toArray(new String[keys.size()]);
			for (String key : array) {
				Object value = jo.get(key);
				jo.remove(key);
				jo.put(camelToUnderline(key), value);
				convert(value);
			}
		}
	}

	private static Object convert(String json) {
		Object obj = JSON.parse(json);
		convert(obj);
		return obj;
	}

	private static String camelToUnderline(String param) {
		if (param == null || param.trim().isEmpty()) {
			return "";
		}
		int len = param.length();
		StringBuilder sb = new StringBuilder(len);
		for (int i = 0; i < len; i++) {
			char c = param.charAt(i);
			if (Character.isUpperCase(c)) {
				sb.append(UNDERLINE);
				sb.append(Character.toLowerCase(c));
			} else {
				sb.append(c);
			}
		}
		return sb.toString();
	}

	public static boolean isJson(String content) {
		try {
			JSONObject.parse(content);
			return true;
		} catch (Exception e) {
			return false;
		}
	}

	public static String readFile(String path) {
		String lastStr = "";
		BufferedReader reader = null;
		try {
			Resource resource = new ClassPathResource(path);
			File file = resource.getFile();
			FileInputStream in = new FileInputStream(file);
			reader = new BufferedReader(new InputStreamReader(new FileInputStream(file)));
			String tempString = null;
			while ((tempString = reader.readLine()) != null) {
				lastStr = lastStr + tempString;
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (reader != null) {
				try {
					reader.close();
				} catch (IOException e1) {
				}
			}
		}
		return lastStr;
	}

	public static JSONArray getJsonArray(String path) {
		JSONArray jsonArray = new JSONArray();
		try {
			ClassPathResource classPathResource = new ClassPathResource(path);
			BufferedReader reader = new BufferedReader(new InputStreamReader(classPathResource.getInputStream(), "utf-8"));
			String line = null;
			String message = new String();
			while ((line = reader.readLine()) != null) {
				message += line;
			}
			jsonArray = (JSONArray) JSONArray.parse(message);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return jsonArray;
	}

	public static JSONObject getJsonObject(String path) {
		JSONObject jsonObject = new JSONObject();
		try {
			ClassPathResource classPathResource = new ClassPathResource(path);
			BufferedReader reader = new BufferedReader(new InputStreamReader(classPathResource.getInputStream(), "utf-8"));
			String line = null;
			String message = new String();
			while ((line = reader.readLine()) != null) {
				message += line;
			}
			jsonObject = (JSONObject) JSONObject.parse(message);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return jsonObject;
	}
}

具体使用案例

        List<User > list=new ArrayList<>();
        User d1=new User ();
        d1.setUserId("1");
        list.add(d1);
		// 只返回userId       
		Object s1 = JsonUtils.toUnderlineJsonString(User.class, list, new String[]{"userId"}, true);
		// 返回除了userId以外的所有字段
        Object s2 = JsonUtils.toUnderlineJsonString(User.class, list, new String[]{"userId"}, false);
        System.out.println(s1);
        System.out.println(s2);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值