json转成java对象

avro生成的代码里,String是CharSequence,不能通过Gson反序列化,于是有了下面的代码,ParseArray里还不完善:

 1 static <T> List<T> parseArray(JSONArray arrary,Class<?> cls) throws IllegalAccessException, InvocationTargetException, NoSuchMethodException, InstantiationException, ClassNotFoundException{
 2       List<T> result = new ArrayList<T>();
 3       String className = cls.getName();
 4       for(int i=0;i<arrary.length();i++){ 
 5           if(className.contains("java.lang")){          
 6               if(className.equals("java.lang.CharSequence") ||
 7                       className.equals("java.lang.String")) {
 8                   result.add((T) arrary.getString(i));
 9               }else  if(className.equals("java.lang.Double")) {
10                   result.add((T) ((Double)arrary.getDouble(i)));
11               }  else  if(className.equals("java.lang.Integer")) {
12                   result.add((T) ((Integer)arrary.getInt(i)));
13               }  else  if(className.equals("java.lang.Boolean")) {
14                   result.add((T) ((Boolean)arrary.getBoolean(i)));
15               }  
16           }else{
17               // 解析对象
18               result.add((T)json2Bean(arrary.getJSONObject(i),cls));
19           }     
20       }  
21       return result;
22   }
23 
24   public static <T> T json2Bean(JSONObject jsonObject, Class<?> cls) throws IllegalAccessException,  
25   InvocationTargetException, NoSuchMethodException, InstantiationException, ClassNotFoundException {  
26 //        if (item == null) {  
27 //          return null;  
28 //        }  
29         T item = (T) cls.newInstance();
30         Field[] fields = cls.getDeclaredFields();  
31         for (Field field : fields) {  
32           String varName = field.getName();  
33           if (jsonObject.has(varName)) {
34               Object value = jsonObject.get(varName); 
35 
36              Class<?> currentClass = field.getType();
37              if(currentClass.equals(List.class)){
38                  JSONArray array = (JSONArray)value;
39                 String subClassName = field.getGenericType().toString().replace("java.util.List<", "");
40                 subClassName = subClassName.substring(0,subClassName.length()-1);
41 //                System.out.println(subClassName);                                    
42                 Class<?> clasz =    Class.forName(subClassName);
43 //                System.out.println(z.getClass());
44                 BeanUtils.setProperty(item, varName, parseArray(array ,clasz));
45             
46              }else{
47                  if(value instanceof JSONObject){
48                      BeanUtils.setProperty(item, varName, json2Bean((JSONObject)value,currentClass));  
49                  }else{
50                     if(value instanceof JSONNull){
51                         value = null;
52                     }
53                    BeanUtils.setProperty(item, varName, value);  
54                  }
55              }
56           }else{
57               // 设置默认值
58               //BeanUtils.setProperty(item, varName, null);    
59           }
60         }  
61          return item;  
62     }  

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏向前进

【笔记】nodejs读取JSON,数组转树

const fs = require('fs'); // --------------- 读取源文件 --------------- const origin...

2294
来自专栏闻道于事

MyBatis框架(二)

导包, 配置mybatis的总配置文件: mybatis-config.xml, 1 <?xml version="1.0" encoding="UTF-8"...

3388
来自专栏技术小黑屋

探究Android中的注解

注解是我们经常接触的技术,Java有注解,Android也有注解,本文将试图介绍Android中的注解,以及ButterKnife和Otto这些基于注解的库的一...

622
来自专栏Jed的技术阶梯

zookeeper案例之4个逻辑思维训练小题目

662
来自专栏Hongten

java开发_UUID(Universally Unique Identifier,全局唯一标识符)和GUID(Globally Unique Identifier,全球唯一标识符)

GUID: 即Globally Unique Identifier(全球唯一标识符) 也称作 UUID(Universally Unique IDentifie...

681
来自专栏一名叫大蕉的程序员

好好玩的螺旋算法No.69

看到一个小伙伴分享这么一个东西,觉得蛮好玩的。先上图。我觉得蛮好玩的,就心心念念想着分享给你们也玩玩,顺便自己实现了一遍。 ? ? 好,现在开始说是怎么玩的。 ...

1779
来自专栏听雨堂

Android新手之旅(9) 自定义的折线图

  希望实现一个折线图,但没有找到合适的控件或者代码,只有一个基本样子的,在它的基础上,进行了一些改进,改得比较灵活,可以传递参数,可以设置位置,坐标轴长度,刻...

2287
来自专栏听雨堂

Android新手之旅(9) 自定义的折线图

  希望实现一个折线图,但没有找到合适的控件或者代码,只有一个基本样子的,在它的基础上,进行了一些改进,改得比较灵活,可以传递参数,可以设置位置,坐标轴长度,刻...

2056
来自专栏开发之途

Android 仿微信通讯录列表侧边栏

1225
来自专栏Android干货

Android项目实战(三十七):Activity管理及BaseActivity的实现

4046

扫码关注云+社区