Java解析Json(反射的应用)

背景:
都知道反射很难,很重要,但是基本语法也感觉不到难度,应用也都是一些基本应用,忽然想到其实Json的解析方式中,大部分都是通过反射,那么……………………
案例设计知识点:反射+泛型
项目主要是两个方法1.把对象信息保存为Json串格式2,把Json串保存为对象
嗯………………………………………………………………脚本吧


import java.io.File;
import java.lang.reflect.Field;
import java.text.MessageFormat;
import java.util.ArrayList;

import cn.hbrj.APIDemo.Student;

/**
 * Json解析和生成Json
 * {"属性":"值","属性":"值","属性":"值","属性":"值","属性":"值"}
 * {"age":"18","name":"小李","score":"99.9"} 
 * @author XuYang
 *
 */
public class JsonHelper {

	/**
	 * 对象转字符串
	 * @param obj
	 * @return
	 * @throws IllegalArgumentException
	 * @throws IllegalAccessException
	 */
	public static String objectToString(Object obj) throws IllegalArgumentException, IllegalAccessException{
		//思路:反射该对象所有的属性  根据名称 拼接字符串
		//拼接字符串 StringBuilder
		
		StringBuilder  builder=new StringBuilder(32);
		//1.创建字符串拼接
		Class cls1=obj.getClass();
		//2.获取对象类型
		Field []  files=cls1.getFields();
		//3.获取所有成员变量
		
		//1)拼接花括号
		builder.append("{");
		for (Field field : files) {
			//一个属性拼接一次"属性":"值",
			//{0}占位符  
			String  str=MessageFormat.
					format("\"{0}\":\"{1}\",",field.getName(),field.get(obj));
		
		
			builder.append(str);
		
		}
		builder.setLength(builder.length()-1);
		//去掉最后一个逗号
		builder.append("}");
		//最后拼接末尾的花括号
		return builder.toString();
		
		
		
		
		
	}


	/**
	 * 字符串读出来 赋值给Person对象 
	 * 疑问:对象不知道类型 还需要创建 因为要赋值
	 * 1.不知道类型 用newInstance创建  
	 * 2.但是 newInstance属于Class的
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws SecurityException 
	 * @throws NoSuchFieldException 
	 */
	public static <T> T  stringToObject(String json,Class<T> cls1) throws InstantiationException, IllegalAccessException, NoSuchFieldException, SecurityException{
		//不知道类型的情况下 需要创建对象 
		T instance= cls1.newInstance();//创建泛型对象
		//1创建对象  
		//"age":"18","name":"小梦","score":"99.9"
		// age  18   i  i+1
		// name 小梦 i   i+1
		//score  99.9
		json=json.replace("{", "").replace("}", "").replace("\"", "");//或括号替换为空
		
		//System.out.println(json);
		//:分割的是  成员变量名:成员变量值 前 age  后 18
		//,分割的是  分割两个成员变量age  18
		String [] strArr= json.split(",|:");//

		
		
		
		//2.解析Json 给对象的每一个成员变量赋值
		
		//使用for循环遍历  i+=2  两个是一组  a  100 i属性 i+1值
		for (int i = 0; i < strArr.length; i+=2) {
			//获取成员变量的名字
			String fieldName=strArr[i];//a b  c  name  age
			//获取成员遍历 设置成员遍历值得时候  field.set(obj,值)
		    Field field=cls1.getField(fieldName);//成员遍历
		    
		    String  value=strArr[i+1];
		    //赋值  
		    
		    //分析:value是字符串 成员变量是int  double  float  String
		    if ("int".equalsIgnoreCase(field.getType().toString())) {
				//如果成员变量得类型 getType 是 int
		    	field.setInt(instance, Integer.parseInt(value));
			}
		    else if ("double".equalsIgnoreCase(field.getType().toString())) {
				//如果成员变量得类型 getType 是 int
		    	field.setDouble(instance,Double.parseDouble(value));
			}
		    else if ("class java.lang.String".equalsIgnoreCase(field.getType().toString())) {
		    	
		    	field.set(instance, value);
				
			} 
		    else {
				//自定义类型和普通类型转换
		        //field.set(obj, value);
		    	
		    	field.set(instance,field.getType().newInstance());
			}		  
		}		
		return instance;
	}


}

还有一个Person类

public class Person {

public Student a;

public int b;

public String c;

public int age;
public String name;

private double score;
@Override
public String toString() {
	return "Person [a=" + a + ", b=" + b + ", c=" + c + ", age=" + age + ", name=" + name + "]";
}
public int getAge() {
	return age;
}
public void setAge(int age) {
	this.age = age;
}
public String getName() {
	return name;
}
public void setName(String name) {
	this.name = name;
}
public Person(int age, String name) {
	super();
	this.age = age;
	this.name = name;
}
public Person() {
	// TODO Auto-generated constructor stub
}


public void  eat(){
	System.out.println("米西米西");
}
public void  eat(String foodName){
	System.out.println("米西米西"+foodName);
}

}

最后测试:

		Person person=new Person(12, "小王");
		person.a=100;
		person.b=200;
		person.c="哈哈哈";
		
		String json= JsonHelper.objectToString(person);
		
		System.out.println(json);//只获取了私有的 成员

再测试另一个
	Person person= JsonHelper.
	stringToObject("{\"a\":\"100\",\"b\":\"200\",\"c\":\"哈哈哈\",\"age\":\"12\",\"name\":\"小梦\"}", Person.class);
	
	
	System.out.println(person.a);//a 是 student
	System.out.println(person.age);
	System.out.println(person.name);
	
	
	//疑问 Json数组
	//{"age":"18","name":"小梦","score":"99.9"} 

告辞!!!!!

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值