在开发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