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

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

package com.kensure.forecast.util;

/**
 * json方法测试类
 * @author lcc
 *
 */
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;
    }
}

package com.kensure.forecast.util;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.kensure.forecast.model.Jqqsyc;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

public class AttributesExtractUtils {


    /**
     * 从集合中提取信息
     * 
     * 适用于:list<对象>
     *
     * @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) {
                System.out.println(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);


        /*********更加复杂的************/

        List<ModelExample> aa = new ArrayList<ModelExample>();
        aa.add(zhangsan);
        aa.add(lisi);

        List<ModelExample> bb = new ArrayList<ModelExample>();
        bb.add(zhangsan);
        bb.add(lisi);

        Map<String,List<ModelExample>> map = new HashMap<String, List<ModelExample>>();

        map.put("aa", aa);
        map.put("bb", bb);

        JSONObject obj = new JSONObject();
        obj.put("success", true);

        JSONObject child = new JSONObject();
        for (Object o : map.keySet()) {  
            List<Map<String, Object>> usersExtractedJson = AttributesExtractUtils.extractForCollection(map.get(o), "lastName", "registerTime");
            child.put(o, usersExtractedJson);
        }  
        obj.put("data", child);
        obj.put("status", 200);

        System.out.println(JSONArray.fromObject( obj ).toString());

    }

}

运行结果

lisiExtracted = {last_name=四, first_name=李}
usersExtracted = [{last_name=四, register_time=1524016599895}, {last_name=三, register_time=1523930199895}]
[{"success":true,"data":{"aa":[{"last_name":"三","register_time":1523930199895},{"last_name":"四","register_time":1524016599895}],"bb":[{"last_name":"三","register_time":1523930199895},{"last_name":"四","register_time":1524016599895}]},"status":200}]

另外一种方法参考:https://blog.csdn.net/qq_21383435/article/details/79224075

猜你喜欢

转载自blog.csdn.net/qq_21383435/article/details/79984680