json 转 javaBean

前言:经常在网络上看见一些关于json自动转换成javaBean的jar包,项目组里的人也在用,稍稍研究了下,都是用的反射来做的。我细细想了下里面的逻辑,我觉得直接生成JavaBean代码岂不是更加直接,反射在移动端,怎么说都是消耗资源的。

Java Bean 类的结构

首先要梳理下,到底Bean类是一个什么样的文件,很简单的是有很多属性的class文件,属性有很多类别,但是从json的角度来看,类别又是有限的:基本类型和List。我们可以用python来模拟下:

# encoding: utf-8
‘‘‘
Created on 2014.12.24

@author: 13051041
‘‘‘

class JavaClass(object):
    ‘‘‘
    class templete
    ‘‘‘
    def __init__(self, name):
        ‘‘‘
        Constructor
        ‘‘‘
        self.mName = name;
        self.mIntegerList = []
        self.mStrList = []
        self.mBolList = []
        self.mListList = []
        self.mClassList = []
        self.mInClassTypeList = []
        self.mIsParcelable = True
        self.mPackageName = "package com.codegenerator;"

    def addIntAttribute(self, str1):
        ‘‘‘
        add String attribute
        ‘‘‘
        self.mIntegerList.append(str1)

    def addUnicodeAttribute(self, str1):
        ‘‘‘
        add String attribute
        ‘‘‘
        self.mStrList.append(str1)

    def addBooleanAttribute(self, bol):
        ‘‘‘
        add Boolean attribute
        ‘‘‘
        self.mBolList.append(bol)

    def addListAttribute(self, list1):
        ‘‘‘
        add List attribute
        ‘‘‘
        self.mListList.append(list1)

    def addClassAttribute(self, cls):
        ‘‘‘
        add Class attribute
        ‘‘‘
        self.mClassList.append(cls)

    def addInClassType(self, inClass):
        ‘‘‘
        add Inner Class attribute
        ‘‘‘
        self.mInClassTypeList.append(inClass)

    def test(self):
        print "-----this is JavaClass information start-----"
        print "class‘s name is %s" % self.mName
        print "class‘s integer is %s " % self.mIntegerList
        print "class‘s String is %s " % self.mStrList
        print "class‘s Boolean is %s " % self.mBolList
        print "class‘s List is %s " % self.mListList
        print "class‘s inner class is %s " % self.mClassList
        print "class‘s inner class type is %s " % self.mInClassTypeList
        print "-----this is JavaClass information end-----"

classNum = 0
def autoGeneratorClassName():
    global classNum
    classNum = classNum + 1
    return "class%d" % classNum

def buildJavaClassNode(jsonObject, className):
    javaclass = JavaClass(className)
    keys = jsonObject.keys()
    for key in keys:
        t = type(jsonObject[key])
        if t == int:
            javaclass.addIntAttribute(key)
        if t == unicode:
            javaclass.addUnicodeAttribute(key)
        if t == bool:
            javaclass.addBooleanAttribute(key)
        if t == dict:
            newClassName = autoGeneratorClassName()
            javaclass.addClassAttribute((newClassName, key))
            javaclass.addInClassType(buildJavaClassNode(jsonObject[key], newClassName))
        if t == list:
            t2 = type(jsonObject[key][0])
            if t2 == dict:
                newClassName = autoGeneratorClassName()
                javaclass.addListAttribute((newClassName, key))
                javaclass.addInClassType(buildJavaClassNode(jsonObject[key][0], newClassName))
            else:
                javaclass.addListAttribute((t2, key))

    return javaclass

  

生成java文件,递归才是王道

我们一个叫javaclass的python类了,用python读取json,直接生成实例。现在的任务是把这个实例,写到文件里面。想想class的嵌套关系,生成最好的方法就是递归:

# encoding: utf-8
‘‘‘
Created on 2014.12.26

@author: 13051041
‘‘‘

Class_import = ‘‘‘
%s

import java.util.ArrayList;
import java.util.List;
import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;
‘‘‘

Class_import_parcelable = ‘‘‘
import android.os.Parcel;
import android.os.Parcelable;
‘‘‘

Class_HEAD = ‘‘‘
public %s class %s {
‘‘‘

Class_HEAD_parcelable = ‘‘‘
public %s class %s implements Parcelable{
    public %s() {
      }

    public  %s(Parcel in) {
    readFromParcel(in);
    }
‘‘‘

Class_Method_END = "}\n"

Attribute_TEMP = "public %s %s;\n"

Method_Analyzer = ‘‘‘
    public void analyzerJson(JSONObject jsonObject) throws JSONException {
        if(jsonObject == null){
            return;
        }
‘‘‘

Method_TEMP = "public %s %s(%s)throws JSONException {\n"
Method_GET_INT = ‘‘‘%s = GetJsonAttributeUtil.getInt(jsonObject, "%s");‘‘‘
Method_GET_String = ‘‘‘%s = GetJsonAttributeUtil.getString(jsonObject,"%s");‘‘‘
Method_GET_Boolean = ‘‘‘%s = GetJsonAttributeUtil.getBoolean(jsonObject,"%s");‘‘‘
Method_GET_CLASS = ‘‘‘%s = new %s();
                      %s.analyzerJson(GetJsonAttributeUtil.getJSONObject(jsonObject,"%s"));‘‘‘
Method_GET_List = ‘‘‘
    %s= new ArrayList<%s>();
    JSONArray array%s = GetJsonAttributeUtil.getJSONArray(jsonObject,"%s");
    int %sLen = array%s.length();
    for(int i = 0;i<%sLen;i++){
         %s item = new %s();
         item.analyzerJson(array%s.getJSONObject(i));
         %s.add(item);
    }
‘‘‘

Method_Parcelable_Write = ‘‘‘public void writeToParcel(Parcel dest, int flags) {\n ‘‘‘
Mehtod_Parcelable_Value_Write = "dest.write%s(%s);\n"
Method_Parcelable_Read = ‘‘‘public void readFromParcel(Parcel in) {\n ‘‘‘
Mehtod_Parcelable_Value_Read = "%s= in.readString();  "

IS_PARCELABLE = True
FILE_NAME = "Bean"

def writeParcelabelMethod(f, jcls):
    # writeToParcel method
    f.write(Method_Parcelable_Write)
    for attribute in jcls.mIntegerList:
        f.write("dest.writeInt(%s);\n" % (attribute))
    for attribute in jcls.mStrList:
        f.write("dest.writeString(%s);\n" % (attribute))
    for attribute in jcls.mBolList:
        f.write("dest.writeByte((byte) (%s ? 1 : 0));\n" % (attribute))

    for attribute in jcls.mListList:
        f.write("dest.writeTypedList(%s);" % (attribute[1]))

    for attribute in jcls.mClassList:
        f.write("dest.writeParcelable(%s, PARCELABLE_WRITE_RETURN_VALUE);" % attribute[1])

    f.write(Class_Method_END)

    # readFromParcel method
    f.write(Method_Parcelable_Read)
    for attribute in jcls.mIntegerList:
        f.write("%s= in.readInt();\n" % (attribute))
    for attribute in jcls.mStrList:
        f.write("%s= in.readString();\n" % (attribute))
    for attribute in jcls.mBolList:
        f.write("%s = in.readByte() != 0;\n" % (attribute))

    for attribute in jcls.mListList:
        f.write("%s = new ArrayList<%s>();" % (attribute[1], attribute[0]))
        f.write("in.readTypedList(%s, %s.CREATOR);" % (attribute[1], attribute[0]))

    for attribute in jcls.mClassList:
        f.write("%s = in.readParcelable(%s.class.getClassLoader());" % (attribute[1], attribute[0]))

    f.write(Class_Method_END)
    # describeContents method
    f.write("public int describeContents() {return 0;}")

    f.write(‘‘‘
          public static final Parcelable.Creator<%s> CREATOR =
                new Parcelable.Creator<%s>() {
            public %s createFromParcel(Parcel in) {
                return new %s(in);
            }

            public %s[] newArray(int size) {
                return new %s[size];
            }
        };
        ‘‘‘ % (jcls.mName, jcls.mName, jcls.mName, jcls.mName, jcls.mName, jcls.mName))

    pass

def writeCls2File(jcls, f):
    f.seek(0, 2)
    # write class header
    if IS_PARCELABLE:  # if need implement parcelable
        if jcls.mName == FILE_NAME:
            f.write(Class_HEAD_parcelable % ("", jcls.mName, jcls.mName, jcls.mName))
        else:
            f.write(Class_HEAD_parcelable % ("static", jcls.mName, jcls.mName, jcls.mName))
    else:
        f.write(Class_HEAD % ("", jcls.mName))

    # write class‘s attribute
    for attribute in jcls.mIntegerList:
        f.write(Attribute_TEMP % (‘int‘, attribute))
    for attribute in jcls.mStrList:
        f.write(Attribute_TEMP % (‘String‘, attribute))
    for attribute in jcls.mBolList:
        f.write(Attribute_TEMP % (‘Boolean‘, attribute))
    for attribute in jcls.mListList:
        f.write(Attribute_TEMP % (‘List<‘ + attribute[0] + ‘>‘, attribute[1]))
    for attribute in jcls.mClassList:
        f.write(Attribute_TEMP % (attribute[0], attribute[1]))

    # write class‘s method analyzerJson
    f.write(Method_Analyzer)
    for attribute in jcls.mIntegerList:
        f.write(Method_GET_INT % (attribute, attribute))
    for attribute in jcls.mStrList:
        f.write(Method_GET_String % (attribute, attribute))
    for attribute in jcls.mBolList:
        f.write(Method_GET_Boolean % (attribute, attribute))
    for attribute in jcls.mClassList:
        f.write(Method_GET_CLASS % (attribute[1], attribute[0], attribute[1], attribute[1]))
    for attribute in jcls.mListList:
        f.write(Method_GET_List % (attribute[1], attribute[0], attribute[1], attribute[1], attribute[1], attribute[1], attribute[1], attribute[0], attribute[0], attribute[1], attribute[1]))
    f.write(Class_Method_END)

    # write parcelable method
    if IS_PARCELABLE:
        writeParcelabelMethod(f, jcls)

    # the method toString
    f.write("public String toString(){")
    f.write("String allInfo = ")
    for attribute in jcls.mIntegerList:
        f.write(‘‘‘ " %s="+%s +  ‘‘‘ % (attribute, attribute))
    for attribute in jcls.mStrList:
        f.write(‘‘‘ " %s="+%s +  ‘‘‘ % (attribute, attribute))
    for attribute in jcls.mBolList:
        f.write(‘‘‘ " %s="+%s +  ‘‘‘ % (attribute, attribute))

    for attribute in jcls.mListList:
        f.write(‘‘‘ " %s="+%s.toString() +  ‘‘‘ % (attribute[1], attribute[1]))

    for attribute in jcls.mClassList:
        f.write(‘‘‘ " %s="+%s.toString() +  ‘‘‘ % (attribute[1], attribute[1]))

    f.write(‘‘‘" ";‘‘‘)
    f.write("return allInfo;")
    f.write(Class_Method_END)

    # write class‘s class
    for innerClass in jcls.mInClassTypeList:
        writeCls2File(innerClass, f)
        pass
    f.write(Class_Method_END)
    pass

def generatorClsFile(jcls):
    global IS_PARCELABLE
    global FILE_NAME
    IS_PARCELABLE = jcls.mIsParcelable
    FILE_NAME = jcls.mName
    f = open(FILE_NAME + ".java", ‘w‘)
    f.write(Class_import % jcls.mPackageName)
    if IS_PARCELABLE:
        f.write(Class_import_parcelable)
    writeCls2File(jcls, f)

  完整项目:http://files.cnblogs.com/files/chenjie0949/CodeGenerator1.3.zip

时间: 2024-07-31 07:45:48

json 转 javaBean的相关文章

json、javaBean、xml互转的几种工具介绍

Json.javaBean.xml互转的几种工具介绍 工作中经常要用到Json.JavaBean.Xml之间的相互转换,用到了很多种方式,这里做下总结,以供参考. 现在主流的转换工具有json-lib.jackson.fastjson等,我为大家一一做简单介绍,主要还是以代码形式贴出如何简单应用这些工具的,更多高级功能还需大家深入研究. 首先是json-lib,算是很早的转换工具了,用的人很多,说实在现在完全不适合了,缺点比较多,依赖的第三方实在是比较多,效率低下,API也比较繁琐,说他纯粹是因

json、javaBean、xml互转的几种工具介绍 (转载)

工作中经常要用到Json.JavaBean.Xml之间的相互转换,用到了很多种方式,这里做下总结,以供参考. 现在主流的转换工具有json-lib.jackson.fastjson等,我为大家一一做简单介绍,主要还是以代码形式贴出如何简单应用这些工具的,更多高级功能还需大家深入研究. 首先是json-lib,算是很早的转换工具了,用的人很多,说实在现在完全不适合了,缺点比较多,依赖的第三方实在是比较多,效率低下,API也比较繁琐,说他纯粹是因为以前的老项目很多人都用到它.不废话,开始上代码. 需

Json与javaBean之间的转换工具类

Json与javaBean之间的转换工具类 /**  * Json与javaBean之间的转换工具类  *  * @author 晚风工作室 www.soservers.com  * @version 20111221  *  * {@code 现使用json-lib组件实现  *    需要  *     json-lib-2.4-jdk15.jar  *     ezmorph-1.0.6.jar  *     commons-collections-3.1.jar  *     commo

IDEA使用GsonFormat完成JSON和JavaBean之间的转换

原文地址:https://www.leshalv.net/posts/12625/ 前言: 之前处理接口传来的一堆数据,用jsonObject很难受,后面就用gosn来弄,配合这个工具体验很好. 转: 最近一直在对接接口,上游返回的都是JSON数据,我们需要将这些数据进行保存,我们可以解析成Map通过key的方式进行获取,然后set到实体类对象中,说到这里我开始想吐了,这样就造成了代码过多,没有可读性,如果有100个值,要get100次,set100次吗?所以最简单的方式是封装成对象,通过对象操

JSON与Javabean转换的几种形式

JSON格式的数据传递是最常用的方法之一,以下列出了常用的几种形态以及与Javabean之间的转换: String json1="{'name':'zhangsan','age':23,'interests':[{'interest':'篮球','colors':['绿色','黄色']},{'interest':'足球','colors':['红色','蓝色']}]}"; String json2="[{'name':'zhangsan'},{'name':'lisi'},{

java to Json or Json to JavaBean

今天练习,放这里,以后再补充 这里使用的jar包是 net.sf.json.JSONObject package yh.test.t1118; import net.sf.json.JSONArray; import net.sf.json.JSONObject; import yh.com.entity.User; import java.util.HashMap; import java.util.List; import java.util.Map; /** * Created by Ad

如何快速通过json构建javabean对象(Intellij IDEA--&gt;GsonFormat使用教程)

和第三方对接的时候,返回给我们的json时参数字段多是很常见的现象,所以我们手动去创建javabean肯定是要花费不少时间,博主在网上找到了很多种,可用通过json自动生成javabean的工具,这里简单的介绍一下Intellij IDEA 中的插件GsonFormat. 1.什么是GsonFormat 将json数据格式转换为javabean对象的as插件. 2.快捷键 Ctrl+ALT+S,或settings -->Plugins -->输入GsonFormat   install plu

json、javaBean 互相转化 的工具 —— json-lib

从刚开始接触JSON 到现在差不多有两年时间了,最初接触JSON只知道是一种轻量级的数据交换格式.它基于JavaScript的一个子集.后来就很少用到了,后来开始使用Easyui ,就不得不跟Json打交道了.但是也一直没有整理过有关Json的相关知识.直到最近,在做一个项目,前台要求特别高,仅仅是easyui提供的方法已经没有办法满足需求,所以对jquery ,json ,又好好的使用了一次.这次让我收获很大.接下来就跟大家分享一下java中解析json的工具有哪些. 现在我知道了主要有三种:

HttpClient、FastJson将json转换为JavaBean

HttpClient 一.HttpClient简介 ????HttpClient 是Apache Jakarta Common 下的子项目,可以用来提供高效的.最新的.功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议.????HTTP 协议可能是现在 Internet 上使用得最多.最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源.虽然在 JDK 的 java net包中已经提供了访问 HTTP 协议的基本功能,