背景:
都知道反射很难,很重要,但是基本语法也感觉不到难度,应用也都是一些基本应用,忽然想到其实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"}
告辞!!!!!