json转java复杂对象的问题

问题描述

现在遇到了一个麻烦我有一个复杂对象json串,比如:{"status":1,"data":{"uid":"1111","data":{"name":"aname","age":11}}}(实际上比这个还要复杂很多)这个时候,我通过自己写的代码解析这个json串生成了对应结构的java物理文件,下面是我的代码(很乱,也没注释……其实和问题本身无关,可以不看)JSONBeanUtil package browser.json.util;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Set;import net.sf.json.JSONArray;import net.sf.json.JSONObject;import browser.json.impl.BeanImpl;import browser.json.impl.PropertyImpl;import browser.json.itf.IProperty;public class JSONBeanUtil {private String jsonString;private String className;private String classPackage;public JSONBeanUtil(String jsonString, String className, String classPackage) {this.jsonString = jsonString;this.className = className;this.classPackage = classPackage;}@SuppressWarnings("rawtypes")public HashMap<String, Class> getJsonMap() throws ClassNotFoundException {return this.putJsonMap(new HashMap<String, Class>(), this.jsonString,this.className, this.classPackage);}public void writeJsonBean() {this.writeJsonBean(this.jsonString, this.className, this.classPackage);}private void writeJsonBean(String strJson, String parentKey,String packageStr) {JSONObject jo = JSONObject.fromObject(strJson);@SuppressWarnings("unchecked")Set<Object> keySet = jo.keySet();Object[] array = keySet.toArray();BeanImpl bean = new BeanImpl();List<IProperty> popatryList = new ArrayList<IProperty>();List<String> importList = new ArrayList<String>();IProperty popatry = (IProperty) new PropertyImpl();for (Object key : array) {String fieldName = key.toString();popatry = (IProperty) new PropertyImpl();String value = jo.getString(fieldName);String firestUp = FreeMarkerUtil.firestUp(fieldName);switch (getFlag(value)) {case 1:popatry.setFiledType("String");break;case 2:popatry.setFiledType(firestUp);importList.add(packageStr + "." + fieldName + "." + firestUp);writeJsonBean(value, fieldName, packageStr + "." + fieldName);break;case 3:String firestJsonArray = getFirestJsonArray(value);if (firestJsonArray.equals("DO1")) {popatry.setFiledType("List<String>");} else {writeJsonBean(firestJsonArray, fieldName, packageStr + "."+ fieldName);popatry.setFiledType("List<" + firestUp + ">");importList.add(packageStr + "." + fieldName + "."+ firestUp);}importList.add("java.util.List");break;}popatry.setFiledName(FreeMarkerUtil.firestLow(fieldName));popatry.setIoFunction(firestUp);popatryList.add(popatry);}bean.setImportList(importList);bean.setClassName(FreeMarkerUtil.firestUp(parentKey));bean.setPackageName(packageStr);bean.setPopatryList(popatryList);FreeMarkerUtil.writeJavaBean(bean);}@SuppressWarnings("rawtypes")private Class getClass(String path) throws ClassNotFoundException {Class cl = Class.forName(path);return cl;}private String getFirestJsonArray(String value) {if (value.length() > 2) {JSONArray ja = JSONArray.fromObject(value);Object[] array = ja.toArray();String string = array[0].toString();if (string.length() > 2) {String flag = string.substring(0, 1)+ string.substring(string.length() - 1, string.length());if (flag.equals("{}")) {return string;} else {return "DO1";}} else {return "DO1";}} else {return "DO1";}}private int getFlag(String value) {if (value.length() > 1) {String flag = value.substring(0, 1)+ value.substring(value.length() - 1, value.length());if (flag.equals("[]")) {return 3;}if (flag.equals("{}")) {return 2;} else {return 1;}} else {return 1;}}public String getJsonString() {return jsonString;}public void setJsonString(String jsonString) {this.jsonString = jsonString;}public String getClassName() {return className;}public void setClassName(String className) {this.className = className;}public String getClassPackage() {return classPackage;}public void setClassPackage(String classPackage) {this.classPackage = classPackage;}}FreeMarkerUtil package browser.json.util;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;import java.io.OutputStreamWriter;import java.io.Writer;import java.util.HashMap;import java.util.Map;import java.util.StringTokenizer;import browser.json.itf.IBean;import freemarker.template.Configuration;import freemarker.template.DefaultObjectWrapper;import freemarker.template.Template;import freemarker.template.TemplateException;/** * * 模板工具类 * * @author hailang * @date 2009-7-9 上午10:21:25 * @version 1.0 */public class FreeMarkerUtil {public static void writeJavaBean(IBean bean) {Map<String, Object> root = new HashMap<String, Object>();root.put("bean", bean);FreeMarkerUtil.analysisTemplate("bean.ftl", "UTF-8", root);}/** * @author hailang * @date 2009-7-9 上午09:55:43 * @param templateName * 模板文件名称 * @param root * 数据模型根对象 * @param templateEncoding * 模板文件的编码方式 */private static void analysisTemplate(String templateName,String templateEncoding, Map<?, ?> root) {try {Configuration config = new Configuration();File file = new File("src/templates");config.setDirectoryForTemplateLoading(file);config.setObjectWrapper(new DefaultObjectWrapper());Template template = config.getTemplate(templateName,templateEncoding);Writer out = new OutputStreamWriter(new FileOutputStream(pathStr(root)), templateEncoding);template.process(root, out);} catch (IOException e) {e.printStackTrace();} catch (TemplateException e) {e.printStackTrace();}}private static String pathStr(Map<?, ?> map) {IBean bean = (IBean) map.get("bean");String packageStr = "src/" + bean.getPackageName();String className = firestUp(bean.getClassName());if (className.length() > 5) {if (className.substring(0, 5).equals("List<")) {className = className.substring(5, className.length() - 1);}}packageStr = packageStr.replace(".", "/");createFile(packageStr);return packageStr + "/" + className + ".java";}private static void createFile(String path) {StringTokenizer st = new StringTokenizer(path, "/");String path1 = st.nextToken() + "/";String path2 = path1;while (st.hasMoreTokens()) {path1 = st.nextToken() + "/";path2 += path1;File inbox = new File(path2);if (!inbox.exists())inbox.mkdir();}}public static String firestUp(String str) {String upperCase = str.toUpperCase();str = upperCase.substring(0, 1) + str.substring(1, str.length());return str;}public static String firestLow(String str) {String lowerCase = str.toLowerCase();str = lowerCase.substring(0, 1) + str.substring(1, str.length());return str;}}通过调用JSONBeanUtil的writeJsonBean()方法即可生成对应结构的javabean物理文件这些其实都没问题问题的关键在于,当我将json转bean(用的json-lib)的时候,JSONObject jo = JSONObject.fromObject(result.getResponse());Object bean = jo.toBean(jo, UserInitInfo.class, map);那个指定property类型的map我就实在不知道该怎么写了……因为很多重名对象,放map貌似不行……不知是我理解有错还是方式不对,还请各位赐教!在此先谢过大家了!!

解决方案

你写的确是很复杂换成Jackson试试用JsonNode(好像是这个),不管多复杂的JAVABEAN都能解析出来

时间: 2024-12-21 02:52:09

json转java复杂对象的问题的相关文章

Gson对Java嵌套对象和JSON字符串之间的转换

JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,具有良好的跨平台特性.近几年来已经和XML一样成为C/S架构中广泛采用的数据格式.有关JSON的更多知识,请参考以下内容:http://json.org/json-zh.html 在服务器和客户端之间使用JSON数据格式进行通信,经常会涉及到JAVA对象和JSON字符串之间的转换.通常,我们可以使用一些JSON解析工具,例如:Gson,FastJson等.当然,我们也可以手动解析,只是会比较繁琐. 下面

json与java对象转换的问题

问题描述 json与java对象转换的问题 请问一下这样的json字符串如何转化为java对象呢? json字符串: "{"post":{"userId":"1","postId":"2"}}" 如果post后面是一个json字符串,那一点问题都没有,但是post后面是一个json对象,这要怎么解析呢?我的javabean是Post.求大神帮忙- 解决方案 Json是标记语言,到任何语言

Java中Json字符串直接转换为对象的方法(包括多层List集合)_java

使用到的类:net.sf.json.JSONObject  使用JSON时,除了要导入JSON网站上面下载的json-lib-2.2-jdk15.jar包之外,还必须有其它几个依赖包:commons-beanutils.jar,commons-httpclient.jar,commons-lang.jar,ezmorph.jar,morph-1.0.1.jar 下面是例子代码: // JSON转换 JSONObject jsonObj = JSONObject.fromObject(jsonSt

GSON解析 json转java对象问题

问题描述 GSON解析 json转java对象问题 使用Gson将JSONObject objectObj 对象转换为Charge对象部分代码: Gson gs = new GsonBuilder().setDateFormat("yyyy-MM-dd").create(); Charge charge = gs.fromJson(objectObj.toString(), Charge.class); 问题是结果charge与objectObj结构一致但是某些字段的值不一样了!!!

如何使用Json实现Java和C的#沟通和通信

我们在项目里经常要涉及到各模块间的通信,这其中又不可避免要碰到各类语言间之间的通信,比如之前做的一个项目里面就是Java发的消息需要C#接收,(具体消息是怎么传输的可以使用RabbitMQ等,关于RabbitMQ的使用总结可以看我之前的博客),都是面向对象的语言,而面向对象的消息怎么反解析到C#是个难题.下面就是使用Json密器让Java和C#沟通的具体办法的总结. 摘要:Json是Java和C#之间通信的利器,Java端将Java对象转变为Json串后发出,C#端接收到Json串后转换为C#对

处理JSON的Java API :JSON的简介

原文链接  作者:Jitendra Kotamraju   译者:撒木 处理JSON的各种解析.生成.处理.转换和查询的JAVA API JSON (JavaScript Object Notation)是一种轻量级的.基于文本的.完全独立于语言的数据交换格式.它非常方便人们和机器的阅读和书写.JSON 有两种结构类型的表现方式:对象和数组.对象是名/值对的无序集合.数组是值(value)的有序集合.值的类型可以是字符串(在双引号中).数字(整数或浮点数).逻辑值(true或false).数组(

使用Json让Java和C#沟通的方法

原文:使用Json让Java和C#沟通的方法 最近很忙啊,新项目下来了,都没时间写博客了.频率降低点,但不能不总结跟大家分享啊. 我们在项目里经常要涉及到各模块间的通信,这其中又不可避免要碰到各类语言间之间的通信,比如之前做的一个项目里面就是Java发的消息需要C#接收,(具体消息是怎么传输的可以使用RabbitMQ等,关于RabbitMQ的使用总结可以看我之前的博客),都是面向对象的语言,而面向对象的消息怎么反解析到C#是个难题.下面就是使用Json密器让Java和C#沟通的具体办法的总结.

class-怎样JAVA获得对象数据?

问题描述 怎样JAVA获得对象数据? 我知道一个实体类对象里封装了我需要的数据, 但我无法修改实体类的代码, 我怎样提取对象内我需要的数据? 例如下面代码怎样获得checkboxBox 对象里面的数据 private AC() { Box checkboxBox = new Box(BoxLayout.X_AXIS); checkboxBox.setBorder(new EmptyBorder(new Insets(5, 10, 5, 10))); long time = System.curr

JSON for java快速入门总结学习_java

一.JSON介绍 JSON(JavaScript Object Notation),类似于XML,是一种数据交换格式,比如Java产生了一个数据想要给JavaScript,则除了利用XML外,还可以利用JSON; JSON相比XML的优势是表达起来很简单:官网:http://www.json.org/ JSON是AJAX中的X(就是可以取代XML);          ------出自JSON创始人; 注意:JSON并不是一个文档格式,没有*.json的文档,一般JSON格式的文档存在txt中,