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 }
关注作者
作者: JadePeng
出处:https://www.cnblogs.com/xiaoqi/p/4738908.html
版权:本文采用「署名-非商业性使用-相同方式共享 4.0 国际(欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接) 」知识共享许可协议进行许可。
标签:
java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了