【Java反射,泛型在Json中的运用】
1. Java反射在Json中的运用
1.1 什么是Java反射
Java反射是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法。对于任意一个对象,都能够调用它的任意方法和属性。这种动态获取对象信息以及动态调用对象方法的功能称为Java反射。
1.2 在Json中使用Java反射
在Java开发中,Json已成为常用的数据传输格式。通常我们需要将Java对象转为Json格式,这时候Java反射就能发挥很好的作用。
例如,我们定义了一个Java对象:
public class Person {
private String name;
private int age;
//getter、setter方法省略
}
我们希望将该对象转换为Json格式,可以使用如下代码:
Person person = new Person();
person.setName("Tom");
person.setAge(18);
JSONObject jsonObject = new JSONObject(person);
System.out.println(jsonObject.toString());
其中的JSONObject
类就是使用Java反射实现的,它实现了将Java对象转换为Json格式的功能。
1.3 使用反射实现通用的Json转换工具
为了更加灵活的将Java对象转换为Json格式,我们可以使用反射编写一个通用的Json转换工具。
首先我们需要定义一个通用的Json转换类JsonConverter
:
public class JsonConverter {
// 将Java对象转为Json格式
public static String toJson(Object object) {
try {
// 创建Json对象
JSONObject jsonObject = new JSONObject();
// 获取Object对象的Class对象
Class<?> clazz = object.getClass();
// 获取Class对象中的所有属性
Field[] fields = clazz.getDeclaredFields();
// 遍历属性并将其添加到Json对象中
for (Field field : fields) {
field.setAccessible(true);
String key = field.getName();
Object value = field.get(object);
jsonObject.put(key, value);
}
return jsonObject.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
然后我们就可以使用该工具将任意Java对象转换为Json格式了:
Person person = new Person();
person.setName("Tom");
person.setAge(18);
String json = JsonConverter.toJson(person);
System.out.println(json);
2. 泛型在Json中的运用
2.1 什么是泛型
泛型是Java编程语言的一种特性,它主要用于解决参数化类型的问题。泛型一般用于集合类中,可以定义泛型类型,让集合类只能存储指定类型的数据。
2.2 在Json中使用泛型
在Json中,我们有时候需要解析一个泛型的集合类,例如List
我们可以使用JsonLib中的TypeReference类,该类可以通过反射获取泛型类型信息。
例如,我们定义了一个泛型的List容器,并且向其中添加了两个Person对象:
List<Person> personList = new ArrayList<>();
Person p1 = new Person();
p1.setName("Tom");
p1.setAge(18);
Person p2 = new Person();
p2.setName("Jack");
p2.setAge(20);
personList.add(p1);
personList.add(p2);
我们想要将该对象转换为Json格式,可以使用如下代码:
String json = JSON.toJSONString(personList);
System.out.println(json);
这样就将该List对象转换为了Json格式。当我们需要将其转回为List对象时,可以使用如下代码:
List<Person> list = JSON.parseObject(json, new TypeReference<List<Person>>() {});
其中的TypeReference类就是使用泛型反射实现的。它可以通过反射获取到List的泛型类型,从而实现将Json转换为Java对象。
2.3 实现通用的泛型Json转换工具
为了让泛型转换更加方便,我们可以使用反射编写一个通用的泛型Json转换工具。
首先我们需要定义泛型Json转换类GenericJsonConverter
:
public class GenericJsonConverter<T> {
private Class<T> clazz;
public GenericJsonConverter(Class<T> clazz) {
this.clazz = clazz;
}
// 将Json格式的字符串转为List对象
public List<T> toList(String json) {
try {
// 创建List对象
List<T> list = new ArrayList<>();
// 创建Json数组对象
JSONArray jsonArray = new JSONArray(json);
// 遍历数组
for (int i = 0; i < jsonArray.length(); i++) {
// 获取Json对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 将Json对象转为Java对象并添加到List中
T t = JSON.toJavaObject(jsonObject, clazz);
list.add(t);
}
return list;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
// 将Java对象转为Json格式的字符串
public String toJson(T t) {
try {
// 创建Json对象
JSONObject jsonObject = new JSONObject();
// 获取Object对象的Class对象
Class<?> clazz = t.getClass();
// 获取Class对象中的所有属性
Field[] fields = clazz.getDeclaredFields();
// 遍历属性并将其添加到Json对象中
for (Field field : fields) {
field.setAccessible(true);
String key = field.getName();
Object value = field.get(t);
jsonObject.put(key, value);
}
return jsonObject.toString();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
然后我们就可以使用该工具将任意泛型对象转换为Json格式了:
List<Person> personList = new ArrayList<>();
Person p1 = new Person();
p1.setName("Tom");
p1.setAge(18);
Person p2 = new Person();
p2.setName("Jack");
p2.setAge(20);
personList.add(p1);
personList.add(p2);
GenericJsonConverter<Person> converter = new GenericJsonConverter<>(Person.class);
String json = converter.toJson(personList);
System.out.println(json);
List<Person> list = converter.toList(json);
for (Person person : list) {
System.out.println(person.getName() + " - " + person.getAge());
}
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java反射,泛型在Json中的运用 - Python技术站