dydytd3400 2011-04-02 01:27
浏览 389
已采纳

json转java复杂对象的问题

现在遇到了一个麻烦

我有一个复杂对象json串,比如:
[code="java"]{"status":1,"data":{"uid":"1111","data":{"name":"aname","age":11}}}(实际上比这个还要复杂很多)[/code]
这个时候,我通过自己写的代码解析这个json串生成了对应结构的java物理文件,下面是我的代码(很乱,也没注释……其实和问题本身无关,可以不看)
JSONBeanUtil
[code="java"]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;
}

}
[/code]
FreeMarkerUtil
[code="java"]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 root = new HashMap();
    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;
    }
    }
    [/code]

通过调用JSONBeanUtil的writeJsonBean()方法即可生成对应结构的javabean物理文件

这些其实都没问题

问题的关键在于,
当我将json转bean(用的json-lib)的时候,
[code="java"]JSONObject jo = JSONObject.fromObject(result.getResponse());
Object bean = jo.toBean(jo, UserInitInfo.class, map);[/code]
那个指定property类型的map我就实在不知道该怎么写了……因为很多重名对象,放map貌似不行……

不知是我理解有错还是方式不对,还请各位赐教!在此先谢过大家了!!

  • 写回答

1条回答 默认 最新

  • liukaihandsome 2011-04-02 13:39
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波