net.sf.json 辅助工具

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;
	}
	
	
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值