JSON 转含有泛型属性的对象

JSON 转含有泛型属性的对象,第1张

返回的json数据里嵌套了对象,接收对象里嵌套了泛型。

解析方式:

1 JSONparseObject();解析  TypeReference<PointResult<泛型具体接收对象>>

2将获取的泛型对象数据(此时是JSONObject类型)转成json字符串,然后再利用JOSNparseObject() 来处理

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

Accountjava:

@Data

public class Account {

private int id;

private String name;

// @PowerfulAnnotation注解是我臆想的

@PowerfulAnnotation("tokenid")

private String tokenId;

@PowerfulAnnotation("tokenkey")

private String key;

}

PowerfulAnnotationjava:

@Target(ElementTypeFIELD)

@Retention(RetentionPolicyRUNTIME)

@Documented

public @interface PowerfulAnnotation {

String value() default "";

}

测试类Mainjava:

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 = gsonfromJson(ori, JsonObjectclass);

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

for (Field field : accountgetClass()getDeclaredFields()) {

String fieldName = fieldgetName();

Class fieldClass = fieldgetType();

Systemoutprint("当前field名:[" + fieldName + "],");

Systemoutprintln("当前field类型:[" + fieldClass + "]");

Annotation annotation = fieldgetDeclaredAnnotation(PowerfulAnnotationclass);

//检查是否有PowerfulAnnotation注解

if (annotation != null) {

PowerfulAnnotation powerful = (PowerfulAnnotation) annotation;

String powerfulValue = powerfulvalue();

Systemoutprintln("发现PowerfulAnnotation注解,值为:[" + powerfulValue + "]");

String[] tmp = powerfulValuesplit("\\");

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

JsonObject tmpJson = jsonObject;

for (int i = 0; i < tmplength; i++) {

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

if (i != tmplength - 1) {

tmpJson = jsonObjectget(tmp[i])getAsJsonObject();

} else {

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

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

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

Field targetField = accountgetClass()getDeclaredField(fieldgetName());

targetFieldsetAccessible(true);//解除私有限制

Systemoutprintln("将[" + powerfulValue + "]的值[" + value + "]赋给目标对象的[" + fieldName + "]");

//将值赋值给目标属性

targetFieldset(account, value);

}

}

}

//属性上没有PowerfulAnnotation注解

else {

//检查当前属性的类型

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

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

Field targetField = accountgetClass()getDeclaredField(fieldgetName());

targetFieldsetAccessible(true);//解除私有限制

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

//将值赋值给目标属性

targetFieldset(account, value);

}

Systemoutprintln("\n");

}

Systemoutprintln("目标对象最终值:" + 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 == Stringclass) {

return fieldget(fieldName)getAsString();

}

if (fieldClass == intclass) {

return fieldget(fieldName)getAsInt();

}

if (fieldClass == booleanclass) {

return fieldget(fieldName)getAsBoolean();

}

return new Gson()fromJson(fieldget(fieldName), fieldClass);

}

}

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

以上代码运行结果:

方法:

JSONObjecttoJSONString(object),转换之后发现属性值为null的属性被删除掉了,查询资料之后发现需要使用SerializerFeature序列化属性:

JSONObjecttoJSONString(Object object, SerializerFeature features)

序列化属性值:

QuoteFieldNames———-输出key时是否使用双引号,默认为true

WriteMapNullValue——–是否输出值为null的字段,默认为false

WriteNullNumberAsZero—-数值字段如果为null,输出为0,而非null

WriteNullListAsEmpty—–List字段如果为null,输出为[],而非null

WriteNullStringAsEmpty—字符类型字段如果为null,输出为”“,而非null

WriteNullBooleanAsFalse–Boolean字段如果为null,输出为false,而非null

示例:

JSONObjecttoJSONString(data, SerializerFeatureWriteMapNullValue);

JsonObject 就是常说的 json。是一种重要的数据传输对象。其格式为{"key1":value1,"key2",value2};key 必须是字符串。

因为ajax请求不刷新页面,但配合js可以实现局部刷新,因此json常常被用来作为异步请求的返回对象使用。

通过responsegetWriter()获取PrintWriter pw,然后pwprint(json)。如果没有设置responsesetContentType("application/json; charset=utf-8"); 则需要自己再js中进行解析。

扩展资料

Java中交互方式分为同步和异步两种:

同步交互:指发送一个请求,需要等待返回,然后才能够发送下一个请求,有个等待过程;

异步交互:指发送一个请求,不需要等待返回,随时可以再发送下一个请求,即不需要等待。

区别:一个需要等待,一个不需要等待,在部分情况下,项目开发中都会优先选择不需要等待的异步交互方式。

比如银行的转账系统,对数据库的保存 *** 作等等,都会使用同步交互 *** 作,其余情况都优先使用异步交互。

1 java中所有的对象都是object子类,数组也是

2 array在json中使用[]

3 一般不判断属性是什么,都是先定义好,然后直接使用object或者array

4 如果有不同情况,可以添加2个属性,一个object,另一个array

你的意思是 通过一个类名 去获取他的属性的类? 这个可以通过反射来实现 存入到JSONObject里面

如果是通过一个实体类去获取他的属性实体类就更简单了。实体类里面提供了 get set方法的话

你就可以直接去get 属性类 存放到JSONObject里面

不过使用JSON需要导入几个包,导入少了会报错

JSONObject有很多optXXX方法,比如optBoolean,optString,optInt

他们的意思是:如果这个JSONObject对象,如果有返回这个属性的值,如果没有返回一个默认值。

例如:

JSONObject json = new JSONObject(content);

int x = jsonoptInt("length",-1);

表示如果json有length属性,则返回length值,否则返回-1;

其他的optXXX方法都类似

以上就是关于JSON 转含有泛型属性的对象全部的内容,包括:JSON 转含有泛型属性的对象、Java的json反序列化:Java数据类可以和json数据结构不一致吗、使用JSONObject转换之后字段丢失等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9489733.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-28
下一篇2023-04-28

发表评论

登录后才能评论

评论列表(0条)

    保存