您的位置:

javajson反射(java类反射)

javajson反射(java类反射)

更新:

本文目录一览:

Java反射的功能:从json到bean

为了实现异步传输(Ajax),通常服务器和浏览器之间的交互都是通过json来完成的。

客户端(浏览器)执行相应的代码,可以将获取到的json通过使用prototype提供的evalJSON函数转换成js对象。

java反射生成json如何去掉自带属性

org.codehaus.groovy.grails.plugins.web.api.ControllersDomainBindingApi@431a3fe1

这样的现实无非就是ControllersDomainBindingApi 这个类没有重写toString方法 ,才出现这样的情况

Java的json反序列化:Java数据类可以和json数据结构不一致吗?

由于时间关系我也没有写全,这里提供一个思路吧。代码如下:

Account.java:

@Data

public class Account {

private int id;

private String name;

// @PowerfulAnnotation注解是我臆想的

@PowerfulAnnotation("token.id")

private String tokenId;

@PowerfulAnnotation("token.key")

private String key;

}

PowerfulAnnotation.java:

@Target(ElementType.FIELD)

@Retention(RetentionPolicy.RUNTIME)

@Documented

public @interface PowerfulAnnotation {

String value() default "";

}

测试类Main.java:

public class Main {

public static void main(String[] args) throws Exception {

Account account = new Account();

String ori = "{\n" +

"\"id\": 11111,\n" +

"\"name\": \"小李\",\n" +

"\"token\": {\n" +

"\"id\": 22222222,\n" +

"\"key\": \"ddddddddd\"\n" +

"}\n" +

"}";

Gson gson = new Gson();

//字符串json转JsonObject

JsonObject jsonObject = gson.fromJson(ori, JsonObject.class);

//反射获取目标对象属性

for (Field field : account.getClass().getDeclaredFields()) {

String fieldName = field.getName();

Class fieldClass = field.getType();

System.out.print("当前field名:[" + fieldName + "],");

System.out.println("当前field类型:[" + fieldClass + "]");

Annotation annotation = field.getDeclaredAnnotation(PowerfulAnnotation.class);

//检查是否有PowerfulAnnotation注解

if (annotation != null) {

PowerfulAnnotation powerful = (PowerfulAnnotation) annotation;

String powerfulValue = powerful.value();

System.out.println("发现PowerfulAnnotation注解,值为:[" + powerfulValue + "]");

String[] tmp = powerfulValue.split("\\.");

//声明一个临时JsonObject,将用于获取下一层json对象

JsonObject tmpJson = jsonObject;

for (int i = 0; i tmp.length; i++) {

//目标值是在powerfulValue的最后一个字段,例如powerfulValue为token.id的话,目标的值就是id,所以先获取token这个jsonObject,并赋值给临时tmpJson

if (i != tmp.length - 1) {

tmpJson = jsonObject.get(tmp[i]).getAsJsonObject();

} else {

//到达powerfulValue的最后一个字段,检查其类型,并赋值给目标对象

Object value = checkFieldType(tmpJson, tmp[i], fieldClass);

//从目标对象中获取目标属性

Field targetField = account.getClass().getDeclaredField(field.getName());

targetField.setAccessible(true);//解除私有限制

System.out.println("将[" + powerfulValue + "]的值[" + value + "]赋给目标对象的[" + fieldName + "]");

//将值赋值给目标属性

targetField.set(account, value);

}

}

}

//属性上没有PowerfulAnnotation注解

else {

//检查当前属性的类型

Object value = checkFieldType(jsonObject, fieldName, fieldClass);

//从目标对象中获取目标属性

Field targetField = account.getClass().getDeclaredField(field.getName());

targetField.setAccessible(true);//解除私有限制

System.out.println("直接将值[" + value + "]赋给目标对象的[" + fieldName + "]");

//将值赋值给目标属性

targetField.set(account, value);

}

System.out.println("*********************************************\n");

}

System.out.println("目标对象最终值:" + account);

}

/**

* 检查当前属性的类型

* (这里由于时间关系,我没有写全,只检查了String、int、boolean类型,全类型应包括boolean、char、byte、short、int、long、float、double,你有时间自己补充一下)

*

* 如果发现当前属性是一个对象,那么应该将JsonObject转换成对应的对象再返回(由于时间关系,这里我也没有试过,总之思路是这样)

*/

private static Object checkFieldType(JsonObject field, String fieldName, Class fieldClass) {

if (fieldClass == String.class) {

return field.get(fieldName).getAsString();

}

if (fieldClass == int.class) {

return field.get(fieldName).getAsInt();

}

if (fieldClass == boolean.class) {

return field.get(fieldName).getAsBoolean();

}

return new Gson().fromJson(field.get(fieldName), fieldClass);

}

}

代码还没写完,主要集中在没有对JsonArray进行处理,当json串里包含数组时会报错,另外一些没写完的我在注释里写了点,你可以参照一下。整体思路还是利用java反射机制进行。

以上代码运行结果:

javajson反射(java类反射)

本文目录一览: 1、Java反射的功能:从json到bean 2、java反射生成json如何去掉自带属性 3、Java的json反序列化:Java数据类可以和json数据结构不一致吗? Java反射

2023-12-08
java反射类,Java的反射

2023-01-04
java类反射,Java中的反射

2023-01-09
javajson映射,Java映射

本文目录一览: 1、有关restful 怎么把json对象直接映射成java对象 2、jackson中objectMapper的使用 3、Java的json反序列化:Java数据类可以和json数据结

2023-12-08
java反射,java反射机制

2023-01-05
java反射,java反射原理

2022-11-21
反射java,反射java中class

2023-01-06
java反射系列之method(java类反射)

2022-11-15
java反射调用一个类(java类的反射)

2022-11-14
浅谈java动态反射(JAVA 反射)

2022-11-15
java反射,java反射三种方法

2022-11-22
反射java,反射java调用方法

2022-12-01
java反射,java反射调用方法

2023-01-04
java反射之我见(JAVA的反射)

2022-11-15
java中反射,java中反射的概念

2023-01-09
java反射之内部类(java反射获取内部类)

2022-11-12
java反射方法,java反射方法 getDeclared

2023-01-03
java反射调用,java反射调用方法

2023-01-06
javajson映射对象,如何将json对象映射到实体类上

本文目录一览: 1、有关restful 怎么把json对象直接映射成java对象 2、JAVA中json转对象 3、json格式的字符串转换为java对象 4、如何将Json对象映射成JavaBean

2023-12-08
java反射方法,java反射方法带参数

2022-11-30