Java 将对象解析成JSON格式 无插件形式

28 篇文章 3 订阅
11 篇文章 0 订阅

自己写的一段解析的代码:

解析后的字符效果:

{'Student':{id:1,string:'这是一个人',address:'长沙',{'Human':{id:1,type:'黄种人',{'Product':{id:1,name:'IPHONE5',description:'产品的描述信息',img:'图片',stock:12,bidPrice:12.0,price:3000.0,null,null,supplier:'美国',addTime:'1970-01-01 08:00:00.1'}}}
{'list':{'Student':{id:1,string:'这是一个人',address:'长沙',{'Human':{id:1,type:'黄种人',{'Product':{id:1,name:'IPHONE5',description:'产品的描述信息',img:'图片',stock:12,bidPrice:12.0,price:3000.0,null,null,supplier:'美国',addTime:'1970-01-01 08:00:00.1'}}},{'Human':{id:1,type:'黄种人',{'Product':{id:1,name:'IPHONE5',description:'产品的描述信息',img:'图片',stock:12,bidPrice:12.0,price:3000.0,null,null,supplier:'美国',addTime:'1970-01-01 08:00:00.1'}}

不过对象的字段有多少个子对象可以解析,用了递归进行解析。

在调用此类进行解析的时候,Bean 的字段请全部使用包装类,否则会出现异常。

代码部分:

主要解析代码:

BeanUtil.java

package org.dreamer.data.util;

import java.lang.reflect.Field;

/**
 * 返回该对象的所有字段值
 * @author Pan
 *
 */
public class BeanUtil {

	/**
	 * 返回当前对象的字符串
	 */
	public String toString() {
		
		return getString(this);
	}

	/**
	 * 返回指定对象的字符串
	 * @param object
	 * @return
	 */
	public String getString(Object object){
		
		if(object==null)
			return "null";
		
		String str = "";
		
		str+="{'"+object.getClass().getSimpleName()+"':{";
		
		Class cl = object.getClass();
		Field[] fields = cl.getDeclaredFields();
		boolean sign = true;
		String s = ",";
		for (Field field : fields) {
			field.setAccessible(true);	//设置成可访问的
			
			//判断字段是不是对象
		
			
			if (sign) {
				s = "";
				sign = false;
			} else {
				s = ",";
			}
			try {
				
				TypeCollection types=new TypeCollection();
				boolean result=types.check(field.get(object));
				
				//如果不是基础类型就用递归求出所有的子对象
				if(!result){
					str+=s+getString(field.get(object));
					continue;
				}
				
				Object value=JSONHelper.check(field.get(object))?"'"+field.get(object)+"'":field.get(object);
				
				str += s + field.getName() + ":" + value;
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		str+="}";
		return str;
	}
}

Json助手类:

JSONHelper.java

package org.dreamer.data.util;

import java.sql.Timestamp;

public class JSONHelper {
	
	/**
	 * 检查是否是String和Timestamp类型
	 * @param object
	 * @return
	 */
	public static boolean check(Object object){
		return object instanceof String || object instanceof Timestamp;
	}
}

JSONSupport.java

调用的话就调用这个类,这个类可以解析对象,和对象数组

package org.dreamer.data.json;

import java.util.Collection;

import org.dreamer.data.util.BeanUtil;

/**
 * JSON 解析对象
 * 在解析对象的时候,如果发现对象的字段类型不是基础类型
 * 那么将调用递归进行循环解析
 * @author Pan
 *
 */
public class JSONSupport {

	/**
	 * 将对象解析成JSON字符串
	 * @param object
	 * @return
	 */
	public static String parseString(Object object){
		
		//检查对象是否继承了BeanUtil类
		String superClass=object.getClass().getSuperclass().getCanonicalName();
		BeanUtil beanUtil=new BeanUtil();
		
		//如果检测到对象已经继承了BeanUtil类,那么将直接调用对象的toString方法
		//BeanUtil 已经对之类的toString进行重新
		//所以无需进行重复的操作
		if(beanUtil.getClass().getCanonicalName().equals(superClass)){
			return object.toString();
		}
		
		return beanUtil.getString(object);
	}
	
	/**
	 * 解析一个集合对象
	 * @param collection
	 * @return
	 */
	public static String parseCollection(Collection collection){
		
		
		
		String str="{'list':";
		boolean sign=true;
		String charStr=",";
		for (Object object : collection) {
			if(sign){
				charStr="";
				sign=false;
			}else {
				charStr=",";
			}
			str+=charStr+parseString(object);
		}
		return str+="";
	}
}

TypeCollection.java 这一个类非常的重要 因为要判断解析的对象是不是基本类型,如果是基本的一些数据类型 就不进行解析。


package org.dreamer.data.util;

import java.lang.reflect.Field;
import java.sql.Timestamp;
/**
 * 基础类型集合
 * @author Pan
 *
 */
public class TypeCollection {

	/**
	 * 基础数据类型的包装类
	 */
	private Integer integer;
	private Double double1;
	private Float float1;
	private Long long1;
	private String string;
	private Character character;
	private Boolean boolean1;
	private Short short1;
	private Timestamp timestamp;

	/**
	 * 检查该对象是不是基础数据类型
	 * @param object
	 * @return
	 */
	public boolean check(Object object) {

		if(object==null)
			return false;
		
		// 获取当前类的Class对象的字段集合
		Field[] fields = this.getClass().getDeclaredFields();
		for (Field field : fields) {
			// 设置字段可访问
			field.setAccessible(true);

			// 获取字段类型来比较
			if (field.getType().getName().equals(object.getClass().getName())) {
				return true;
			}

		}
		return false;
	}
}


非常容易就解析成JSON了,比起网上臃肿的插件,这方便了少许。

下面给一段我测试的代码:

请勿直接运行,会报错。

package com.domain;

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

import org.dreamer.data.json.JSONSupport;
import org.dreamer.data.util.BeanUtil;
import org.dreamer.data.util.TypeCollection;

import com.pan.action.Product;
import com.pan.beans.User;

public class JSONTest {

	public static void main(String[] args) throws Exception {
		
		
		Student student=new Student();
		student.setAddress("长沙");
		
		Product product=new Product();
		product.setAddTime(new Timestamp(100));
		product.setBidPrice(12d);
		product.setDescription("产品的描述信息");
		product.setId(1);
		product.setImg("图片");
		product.setName("IPHONE5");
		product.setPrice(3000d);
		product.setStock(12);
		product.setSupplier("美国");
		Human human=new Human();
		human.setProduct(product);
		human.setId(1);
		human.setType("黄种人");
		
		student.setHuman(human);
		student.setId(1);
		student.setString("这是一个人");
		
		System.out.println(student.getClass().getSuperclass().getCanonicalName());
		List list=new ArrayList();
					
			list.add(student);
			list.add(human);
		
		System.out.println(student);
		System.out.println(JSONSupport.parseCollection(list));
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值