您当前的位置:首页 > 互联网教程

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

发布时间:2025-05-24 05:47:19    发布人:远客网络

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

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

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

2、//@PowerfulAnnotation注解是我臆想的

3、@PowerfulAnnotation("token.id")

4、@PowerfulAnnotation("token.key")

5、@Retention(RetentionPolicy.RUNTIME)

6、public@interface PowerfulAnnotation{

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

8、Account account= new Account();

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

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

11、String fieldName= field.getName();

12、Class fieldClass= field.getType();

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

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

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

16、//检查是否有PowerfulAnnotation注解

17、PowerfulAnnotation powerful=(PowerfulAnnotation) annotation;

18、String powerfulValue= powerful.value();

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

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

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

22、JsonObject tmpJson= jsonObject;

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

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

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

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

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

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

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

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

31、targetField.set(account, value);

32、//属性上没有PowerfulAnnotation注解

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

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

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

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

37、targetField.set(account, value);

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

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

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

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

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

43、if(fieldClass== String.class){

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

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

46、if(fieldClass== boolean.class){

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

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

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

二、什么是json的序列化和反序列化

1、序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

2、序列化的实现:将需要被序列化的类实现Serializable接口,该接口没有需要实现的方法,implements Serializable只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

三、jackson反序列化报错,什么原因呢

1、当你在使用Jackson框架将前端传来的JSON数据转换为Java对象时,可能会遇到"Unrecognized field, not marked as ignorable"这样的错误。这个错误提示意味着JSON数据中包含了Java对象所没有定义的属性。Jackson并未识别这些额外字段,因为它没有被标记为可忽略。

2、解决这个问题有几种方法。首先,确保JSON数据的格式正确,避免包含非目标对象的属性。其次,可以在目标Java对象的类级别上添加@JsonIgnoreProperties注解,设置ignoreUnknown属性为true,这样Jackson在反序列化时会自动忽略未知的字段。或者,你可以全局配置DeserializationFeature,通过设置FAIL_ON_UNKNOWN_PROPERTIES为false,让objectMapper在反序列化时忽略未知属性。

3、问题的根源可能是之前同事的命名规范不一致,导致IDEA(集成开发环境)在生成对象时出现问题。因此,遵循编程最佳实践,比如避免使用以is开头的字段,或者手动定制get、set方法,能有效避免此类问题。这样,你就可以确保Jackson能够正确处理预期的Java对象结构,避免出现"Unrecognized field"的错误了。