1、实现了可配置过滤,可转换吐出属性名。
这里有两种模式:
a:普通的以传参的形式设置规则,
b:以注解的方式设置规则(可配置规则分组,不同的情形用不同的分组规则)
jar包地址 jsonHelper工具包
2、2020-12-10新增null处理
3、2021-07-06 新增对转换bean时,bean无对应属性报错处理
使用示例:
package com.coolsn.modules.tb.jsonHelper;
import java.util.List;
import com.google.common.collect.Lists;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
public class TestMain {
public static void main(String[] args){
testNormal();
testAnnotation();
}
/**
* toBean时没有对应属性报错处理示例
*/
private static void testToBeanConfig() {
TestBean testBean = new TestBean("1", "2", "3");
testBean.setTestBean2(new TestBean2("1", "2", "3"));
testBean.setTestBean3(new TestBean("1", "2", "3"));
//现在转成jsonObject
JSONObject testJsonObject = JSONObject.fromObject(testBean);
//添加一个testBean中没有的属性,这个属性需要是一个JSONObject对象才会报错
testJsonObject.element("noField", new JSONObject().element("test", 1));
JSONArray jsonArray = new JSONArray();
jsonArray.add(testJsonObject);
//一般的转换会报错
//List<TestBean> testBeans = (List<TestBean>) JSONArray.toCollection(jsonArray,TestBean.class);
//使用工具的config就不会报错了
List<TestBean> testBeans = (List<TestBean>) JSONArray.toCollection(jsonArray, JSONUtils.toBeanConfig(TestBean.class));
//同理的
TestBean testBean2 = (TestBean) JSONObject.toBean(testJsonObject, JSONUtils.toBeanConfig(TestBean.class));
}
//普通配置方法使用示例
private static void testNormal() {
//测试转Object
TestBean testBean = new TestBean("1", "2", "3");
testBean.setTestBean2(new TestBean2("1", "2", "3"));
testBean.setTestBean3(new TestBean("1", "2", "3"));
JSONObject testJsonObject = JSONObject.fromObject(testBean,JSONUtils.getJsonConfig(new JSONUtilsBeans()
.addBean(TestBean.class,new String[] {"testId::id","testName","testBean2","testBean3"})
.addBean(TestBean2.class,new String[] {"testName::name"}).beFilter(false)
));
System.out.println(testJsonObject);
//测试转JSONArray
TestBean testBeanA = new TestBean("1", "2", "3");
testBeanA.setTestBean2(new TestBean2("1", "2", "3"));
List<Object> tetList = Lists.newArrayList();
tetList.add(testBeanA);
tetList.add(new String[] {"1","3"});
JSONArray testJsonA = JSONArray.fromObject(tetList,JSONUtils.getJsonConfig(new JSONUtilsBeans()
.addBean(TestBean.class,new String[] {"testId::id","testName","testBean2"})
.addBean(TestBean2.class,new String[] {"testName::name"})
));
System.out.println(testJsonA);
}
//注解的方式
private static void testAnnotation() {
//测试转Object
TestBean testBean = new TestBean("1", "2", "3");
testBean.setTestBean2(new TestBean2("1", "2", "3"));
//情况1,使用规则1
JSONObject testJsonObject = JSONObject.fromObject(testBean,JSONUtils.getJsonConfigByAnnotation(new JSONUtilsBeansAnnotation()
.addBean(TestBean.class,"1")
.addBean(TestBean2.class,"1")
));
System.out.println(testJsonObject);
//情况2,使用规则2
JSONObject testJsonObject2 = JSONObject.fromObject(testBean,JSONUtils.getJsonConfigByAnnotation(new JSONUtilsBeansAnnotation()
.addBean(TestBean.class,"2")
.addBean(TestBean2.class,"2")
));
System.out.println(testJsonObject2);
//情况3,使用规则3
JSONObject testJsonObject3 = JSONObject.fromObject(testBean,JSONUtils.getJsonConfigByAnnotation(new JSONUtilsBeansAnnotation()
.addBean(TestBean.class,"3")
.addBean(TestBean2.class,"3")
));
System.out.println(testJsonObject3);
}
}
主类:
package com.coolsn.modules.tb.jsonHelper;
import java.lang.reflect.Field;
import java.util.Collection;
import java.util.List;
import java.util.Optional;
import org.apache.commons.lang3.StringUtils;
import net.sf.json.JSONArray;
import net.sf.json.JSONException;
import net.sf.json.JSONNull;
import net.sf.json.JSONObject;
import net.sf.json.JsonConfig;
import net.sf.json.processors.JsonBeanProcessor;
import net.sf.json.processors.JsonValueProcessor;
import net.sf.json.util.PropertySetStrategy;
public class JSONUtils {
/**
*
* 获取jsonObject转换的配置config
*
* 不污染实体bean对象
*
* @param jsonUtilsBeans 要吐出的属性名配置,其中如果要对属性进行名称的转换,例如原实例中为name,要改为userName,则组装为name::userName
* new JSONUtilsBeans()
.addBean(TestBean.class,new String[] {"testId::id","testName","testBean2"})
.addBean(TestBean2.class,new String[] {"testName::name"})
)
* @return
*/
public static JsonConfig getJsonConfig(JSONUtilsBeans jsonUtilsBeans){
JsonConfig jsonConfig = new JsonConfig();
List<JSONUtilsBean> juBeans = jsonUtilsBeans.getBeans();
if (juBeans != null) {
for (int i = 0; i < juBeans.size(); i++) {
JSONUtilsBean juBean = juBeans.get(i);
Class<?> beanObject = juBean.getObject();
String[] inclue = juBean.getInclude();
boolean filter = juBean.isFilter();
//返回成自己设定的jsonObject
jsonConfig.registerJsonBeanProcessor(beanObject, new JsonBeanProcessor() {
@Override
public JSONObject processBean(Object bean, JsonConfig jsonConfig) {
//实例的运行时类
Class<?> c = bean.getClass();
//返回的json
JSONObject resultJson = new JSONObject();
//属性名对应的转换后的名
JSONObject fieldTras = new JSONObject();
//循环取需要的属性
for(int i=0; i<inclue.length; i++) {
String keyP = inclue[i]; String[] keyPs = keyP.split("::");
//真实的key
String keyA = keyPs[0]; //要转换为的key
String keyT = "";
if(keyPs.length > 1) { keyT = keyPs[1]; }
Field field2;
Object value = null;
try {
//通过反射取属性的值
field2 = c.getDeclaredField(keyA);
field2.setAccessible(true);
//取值
value = field2.get(bean);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//值为null的话置为空
if (value == null) { value = ""; }
//如果目标key不为空,则重置key为目标key
if (StringUtils.isNoneBlank(keyT)) {
//记录转换
fieldTras.element(keyA, keyT);
//重置
keyA = keyT;
}
if (! (value instanceof String)) {
if (value instanceof Collection) {
value = JSONArray.fromObject(value,jsonConfig);
}else {
value = JSONObject.fromObject(value,jsonConfig);
}
}
resultJson.element(keyA, value);
}
//不进行过滤,只进行转换
if (!filter) {
try {
//通过反射取属性的值
Field[] fields = c.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
Field field = fields[j];
field.setAccessible(true);
String name = field.getName();
Object value = field.get(bean);
//判断是否有进行转换
if (fieldTras.containsKey(name)) {
//已经进行了转换,不做处理
}else {
//没做转换的
if (! (value instanceof String)) {
if (value instanceof Collection) {
value = JSONArray.fromObject(value,jsonConfig);
}else {
value = JSONObject.fromObject(value,jsonConfig);
}
}
resultJson.element(name, value);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return resultJson;
}
});
}
}
return jsonConfig;
}
/**
*
* 获取jsonObject转换的配置config
*
* 通过注解实体bean
*
* @return
*/
public static JsonConfig getJsonConfigByAnnotation(JSONUtilsBeansAnnotation jsonUtilsBeans){
JsonConfig jsonConfig = new JsonConfig();
List<JSONUtilsBeanAnnotation> juBeans = jsonUtilsBeans.getBeans();
if (juBeans != null) {
for (int i = 0; i < juBeans.size(); i++) {
JSONUtilsBeanAnnotation juBean = juBeans.get(i);
Class<?> beanObject = juBean.getObject();
String group = juBean.getGroup();
//返回成自己设定的jsonObject
jsonConfig.registerJsonBeanProcessor(beanObject, new JsonBeanProcessor() {
@Override
public JSONObject processBean(Object bean, JsonConfig jsonConfig) {
//实例的运行时类
Class<?> c = bean.getClass();
//返回的json
JSONObject resultJson = new JSONObject();
try {
//通过反射取属性的值
Field[] fields = c.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
Field field = fields[j];
field.setAccessible(true);
String name = field.getName();
Object value = field.get(bean);
JSONUtilsAnnotation[] jsonUtilsAnnotations = field.getDeclaredAnnotationsByType(JSONUtilsAnnotation.class);
//是否排除属性
boolean removeField = false;
for (int k = 0; jsonUtilsAnnotations != null && k < jsonUtilsAnnotations.length; k++) {
JSONUtilsAnnotation jsonUtilsAnnotation = jsonUtilsAnnotations[k];
if (jsonUtilsAnnotation != null) {
//有进行规制注解,按注解规制处理
boolean exclude = jsonUtilsAnnotation.exclude();
String groups = jsonUtilsAnnotation.groups();
String tName = jsonUtilsAnnotation.tName();
//处理模式,true不进行规则处理模式
boolean normalHandle = true;
if (StringUtils.isNoneBlank(groups)) {
//有进行分组设置
if (!(groups+",").contains(group+",")) {
//不属于该分组,是过滤规则不生效
normalHandle = true;
}else {
//按过滤规则处理
normalHandle = false;
}
}else {
//没有分组,按过滤规则处理
normalHandle = true;
}
//判断是否过滤规则生效
if (!normalHandle) {
//按过滤规则处理
if (!exclude) {
//包含该属性
if (StringUtils.isNoneBlank(tName)) {
//要进行属性名称转换
name = tName;
}
}else {
//排除该属性
removeField = true;
}
//已经匹配到了规则,跳出
break;
}
}
}
//排除属性
if (removeField) {
continue;
}
if (value == null) {
value = "";
}
if (! (value instanceof String)) {
if (value instanceof Collection) {
value = JSONArray.fromObject(value,jsonConfig);
}else {
value = JSONObject.fromObject(value,jsonConfig);
}
}
resultJson.element(name, value);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return resultJson;
}
});
}
}
return jsonConfig;
}
/**
*
* 获取jsonObject转换对null进行处理的配置config
*
* @param jsonConfig 自定义过的config
* @param value 对null要进行替换的值
* @return
*/
public static JsonConfig getJsonConfigCNull(JsonConfig jsonConfig,String value){
if (jsonConfig == null) {
jsonConfig = new JsonConfig();
}
jsonConfig.registerJsonValueProcessor(JSONNull.class, new JsonValueProcessor() {
@Override
public Object processObjectValue(String arg0, Object arg1, JsonConfig arg2) {
// TODO Auto-generated method stub
return value;
}
@Override
public Object processArrayValue(Object arg0, JsonConfig arg1) {
// TODO Auto-generated method stub
return JSONArray.fromObject(arg0,arg1);
}
});
return jsonConfig;
}
/**
*
* 获取jsonObject转换对null进行处理的配置config
*
* value 替换值
*
* @return
*/
public static JsonConfig getJsonConfigCNull(String value){
return getJsonConfigCNull(null,value);
}
/**
*
* 获取toBean的config
*
* 1、处理了对bean中没有的属性进行忽略
*
* @param jsonConfig 自定义的config
* @param beanClass
* @return
*/
public static JsonConfig toBeanConfig(JsonConfig jsonConfig,Class<?> beanClass){
JsonConfig cfg = Optional.ofNullable(jsonConfig).orElseGet(()->new JsonConfig());
cfg.setPropertySetStrategy( new PropertySetStrategy() {
@Override
public void setProperty(Object arg0, String arg1, Object arg2)
throws JSONException {
try {
PropertySetStrategy.DEFAULT.setProperty(arg0, arg1, arg2);
} catch (Exception e) {
// TODO: handle exception
}
}});
cfg.setRootClass(beanClass);
return cfg;
}
/**
*
* 获取toBean的config
*
* 1、处理了对bean中没有的属性进行忽略
*
* @param beanClass
* @return
*/
public static JsonConfig toBeanConfig(Class<?> beanClass){
return toBeanConfig(null,beanClass);
}
}
注解定义类:
package com.coolsn.modules.tb.jsonHelper;
import java.lang.annotation.ElementType;
import java.lang.annotation.Repeatable;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Repeatable(JSONUtilsAnnotations.class)
public @interface JSONUtilsAnnotation {
/**
* 转换后的输出名称
* @return
*/
String tName() default "";
/**
* 要忽略的属性
* @return
*/
boolean exclude() default false;
/**
* 分组,如果要让该规则生效于多个分组则以逗号隔开
* @return
*/
String groups() default "";
}
多注解配置类:
package com.coolsn.modules.tb.jsonHelper;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface JSONUtilsAnnotations {
JSONUtilsAnnotation [] value();
}
普通配置bean类:
package com.coolsn.modules.tb.jsonHelper;
class JSONUtilsBean {
//类
private Class c;
//过滤包含属性
private String[] include;
//是否进行过滤,如果是true则只会提取include包含的数据,否则只做属性名称转换而不做筛选
private boolean filter = true;
JSONUtilsBean(Class c,String[] include){
this.c = c;
this.include = include;
}
public Class getObject() {
return c;
}
public void setObject(Class c) {
this.c = c;
}
public String[] getInclude() {
return include;
}
public void setInclude(String[] include) {
this.include = include;
}
public boolean isFilter() {
return filter;
}
public void setFilter(boolean filter) {
this.filter = filter;
}
}
普通配置bean设值辅助类:
package com.coolsn.modules.tb.jsonHelper;
import java.util.List;
import com.google.common.collect.Lists;
public class JSONUtilsBeans {
//多个类型列表
private List<JSONUtilsBean> beans;
//配置类bean
private JSONUtilsBean bean;
public List<JSONUtilsBean> getBeans() {
return beans;
}
//添加规则
public JSONUtilsBeans addBean(Class c,String[] include) {
if (this.beans == null) {
this.beans = Lists.newArrayList();
}
this.bean = new JSONUtilsBean(c, include);
this.beans.add(this.bean);
return this;
}
//设置是否进行筛选
public JSONUtilsBeans beFilter(boolean filter) {
this.bean.setFilter(filter);
return this;
}
}
注解配置规则实体:
package com.coolsn.modules.tb.jsonHelper;
class JSONUtilsBeanAnnotation {
//类
private Class c;
//分组,指定这次生效的分组
private String group;
JSONUtilsBeanAnnotation(Class c,String group){
this.c = c;
this.group = group;
}
public Class getObject() {
return c;
}
public void setObject(Class c) {
this.c = c;
}
public String getGroup() {
return group;
}
public void setGroup(String group) {
this.group = group;
}
}
注解配置实体设置辅助类:
package com.coolsn.modules.tb.jsonHelper;
import java.util.List;
import com.google.common.collect.Lists;
public class JSONUtilsBeansAnnotation {
//多个类型列表
private List<JSONUtilsBeanAnnotation> beans;
private JSONUtilsBeanAnnotation bean;
public List<JSONUtilsBeanAnnotation> getBeans() {
return beans;
}
//添加规则
public JSONUtilsBeansAnnotation addBean(Class c,String group) {
if (this.beans == null) {
this.beans = Lists.newArrayList();
}
this.bean = new JSONUtilsBeanAnnotation(c, group);
this.beans.add(this.bean);
return this;
}
}
测试实体1:
package com.coolsn.modules.tb.jsonHelper;
public class TestBean {
@JSONUtilsAnnotation(tName = "2Id",groups = "2")
private String testId;
@JSONUtilsAnnotation(tName = "12name",groups = "1,2")
private String testName;
@JSONUtilsAnnotation(tName = "3name",groups = "3")
private String testNo;
private TestBean2 testBean2;
@JSONUtilsAnnotation(tName = "2时排除",exclude = true,groups = "2")
@JSONUtilsAnnotation(tName = "1时改名1",groups = "1")
@JSONUtilsAnnotation(tName = "3时改名3",groups = "3")
private TestBean testBean3;
public TestBean() {
}
public TestBean(String testId,String testName,String testNo) {
this.testId = testId;
this.testName = testName;
this.testNo = testNo;
}
public TestBean2 getTestBean2() {
return testBean2;
}
public void setTestBean2(TestBean2 testBean2) {
this.testBean2 = testBean2;
}
public String getTestId() {
return testId;
}
public void setTestId(String testId) {
this.testId = testId;
}
public String getTestName() {
return testName;
}
public void setTestName(String testName) {
this.testName = testName;
}
public String getTestNo() {
return testNo;
}
public void setTestNo(String testNo) {
this.testNo = testNo;
}
public TestBean getTestBean3() {
return testBean3;
}
public void setTestBean3(TestBean testBean3) {
this.testBean3 = testBean3;
}
}
测试实体2:
package com.coolsn.modules.tb.jsonHelper;
public class TestBean2 {
private String testId;
private String testName;
@JSONUtilsAnnotation(tName = "12No",groups = "1,2")
private String testNo;
public TestBean2() {
// TODO Auto-generated constructor stub
}
public TestBean2(String testId,String testName,String testNo) {
this.testId = testId;
this.testName = testName;
this.testNo = testNo;
}
public String getTestId() {
return testId;
}
public void setTestId(String testId) {
this.testId = testId;
}
public String getTestName() {
return testName;
}
public void setTestName(String testName) {
this.testName = testName;
}
public String getTestNo() {
return testNo;
}
public void setTestNo(String testNo) {
this.testNo = testNo;
}
}