由于时间关系我也没有写全,这里提供一个思路吧。代码如下:
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 = 0i <tmp.lengthi++) {
//目标值是在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反射机制进行。
以上代码运行结果:
1、对象:对象在js中表示为“{}”括起来的内容,数据结构为 {key:value,key:value,...}的键值对的结构,在面向对象的语言中,key为对象的属性,value为对应的属性值,所以很容易理解,取值方法为 对象.key 获取属性值,这个属性值的类型可以是 数字、字符串、数组、对象几种。在Java中就是一种Map结构。2、数组:数组在js中是中括号“[]”扩起来的内容,数据结构为 ["java","javascript","vb",...],取值方式和所有语言中一样,使用索引获取,字段值的类型可以是 数字、字符串、数组、对象几种。在Java中是一种list结构。
在Java中,可以使用Jackson库将Java对象转换为JSON格式。例如,假设有一个名为person的Person对象,可以使用以下代码将其转换为JSON格式:import com.fasterxml.jackson.databind.ObjectMapperObjectMapper mapper = new ObjectMapper()String json = mapper.writeValueAsString(person)
这段代码中,ObjectMapper类是Jackson库中的一个核心类,用于将Java对象转换为JSON格式。首先创建一个ObjectMapper对象,然后调用其writeValueAsString方法将Person对象转换为JSON格式的字符串。最后将该字符串返回即可。
需要注意的是,如果要将Java对象转换为JSON格式,需要为该对象添加getter方法,以便ObjectMapper类能够访问该对象的属性。另外,需要在pom.xml文件中添加Jackson库的依赖,例如:
<dependency><groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><version>2.12.3</version></dependency>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)