美文网首页
如何让JSON只从Model中输出一部分?

如何让JSON只从Model中输出一部分?

作者: caobug | 来源:发表于2016-06-10 15:07 被阅读187次

    在开发WEB应用中,我们需要经常输出JSON给到前端,比较直接的做法是直接返回实体,如 return new User(),但这使我们把User的所有属性全部输出,这其中难免会有敏感信息,并且有部分信息前端根本用不上。虽然有些类库可以通过注解标明输出时忽略某些属性渲染,但有时某个属性在这不需要输出,在另一个地方却可能需要输出。

    最终我写了个工具类来解决这个问题,不当之处还请指出:

    public class AttributesExtractUtils {
    
        private static Logger LOGGER = LogManager.getLogger(AttributesExtractUtils.class);
    
        /**
         * 从集合中提取信息
         *
         * @param targets
         * @param targetFields
         * @return
         */
        public static List<Map<String, Object>> extractForCollection(Collection<?> targets, String... targetFields) {
            List<Map<String, Object>> result = new ArrayList<>();
            for (Object target : targets) {
                result.add(extract(target, targetFields));
            }
            return result;
        }
    
        /**
         * 从普通POJO类中提取关键信息, 要求遵循 getMethod 规范
         *
         * @param target       目标JAVA POJO类,要求装有数据
         * @param targetFields 类的属性名字: 希望从 POJO 中提取哪些字段的数据
         * @return 数据会被装载于MAP中
         */
        public static Map<String, Object> extract(Object target, String... targetFields) {
            if ((null == target) || null == targetFields || 0 == targetFields.length) {
                return new HashMap<>();
            }
            Map<String, Object> objectMap = new HashMap<>();
            for (String targetField : targetFields) {
                Class<?> targetClass = target.getClass();
                try {
                    Field field = targetClass.getDeclaredField(targetField);
                    String methodNamePrefix = field.getType().getName().equals("boolean") ? "is" : "get";
                    String methodName = methodNamePrefix + String.valueOf(targetField.charAt(0)).toUpperCase()
                            + targetField.substring(1);
                    Method targetMethod = targetClass.getMethod(methodName);
                    Object invoke = targetMethod.invoke(target);
                    objectMap.put(getNameOfElegant(targetField), invoke);
                } catch (Exception e) {
                    LOGGER.error(e.getMessage(), e);
                }
            }
            return objectMap;
        }
    
        private static String getNameOfElegant(String old) {
            StringBuilder stringBuilder = new StringBuilder();
            for (char c : old.toCharArray()) {
                if (Character.isUpperCase(c) && stringBuilder.length() > 0) {
                    stringBuilder.append("_");
                }
                stringBuilder.append(c);
            }
            return stringBuilder.toString().toLowerCase();
        }
    
        public static void main(String[] args) {
            // System.out.println(getNameOfElegant("AbcDef"));
            // System.out.println(getNameOfElegant("abcDefXlA"));
    
            ModelExample lisi = new ModelExample();
            lisi.setFirstName("李");
            lisi.setLastName("四");
            lisi.setGender(1);
            lisi.setRegisterTime(System.currentTimeMillis());
    
            ModelExample zhangsan = new ModelExample();
            zhangsan.setFirstName("张");
            zhangsan.setLastName("三");
            zhangsan.setGender(0);
            zhangsan.setRegisterTime(System.currentTimeMillis() - 86400000);
    
            // 从单个对象中提取
            Map<String, Object> lisiExtracted = AttributesExtractUtils.extract(lisi, "firstName", "lastName");
            System.out.println("lisiExtracted = " + lisiExtracted);
    
            // 从集合中提取
            List<ModelExample> users = new ArrayList<>(Arrays.asList(lisi, zhangsan));
            List<Map<String, Object>> usersExtracted = AttributesExtractUtils
                    .extractForCollection(users, "lastName", "registerTime");
            System.out.println("usersExtracted = " + usersExtracted);
        }
    
        private static class ModelExample {
    
            private String firstName;
            private String lastName;
            private int gender;
            private long registerTime;
    
            public String getFirstName() {
                return firstName;
            }
    
            public void setFirstName(String firstName) {
                this.firstName = firstName;
            }
    
            public String getLastName() {
                return lastName;
            }
    
            public void setLastName(String lastName) {
                this.lastName = lastName;
            }
    
            public int getGender() {
                return gender;
            }
    
            public void setGender(int gender) {
                this.gender = gender;
            }
    
            public long getRegisterTime() {
                return registerTime;
            }
    
            public void setRegisterTime(long registerTime) {
                this.registerTime = registerTime;
            }
        }
    }```
    
    最终 `public static void main(String[] args) { // .. }` 将输出:
    
    

    lisiExtracted = {first_name=李, last_name=四}
    usersExtracted = [{register_time=1465541775993, last_name=四}, {register_time=1465455375993, last_name=三}]

    相关文章

      网友评论

          本文标题:如何让JSON只从Model中输出一部分?

          本文链接:https://www.haomeiwen.com/subject/mhysdttx.html