`

java中使用json-lib.jar实现bean与json的之间转换(primitive类型以及嵌套class)

 
阅读更多
一、内容摘要:
1、首先要声明的是,本文仅提供了一个简单的用法,如果想对json-lib有更多了解,查看json-lib的官网:http://json-lib.sourceforge.net/,上面有十分详细的文档,从配置到入门教程再到各种高级功能,应有尽有。
2、使用json-lib,可以将java对象转成json格式的字符串,同样也可以将json字符串转换成Java对象。下面分准备工作、主要步骤以及注意事项三部分来说明。

二、准备工作:
下载json-lib.jar:
http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/
以及所依赖的其它包(注:jakarta commons的包可以到Apache的官网下载,ezmorph可以去SourceForge下载。)
jakarta commons-lang 2.5
jakarta commons-beanutils 1.8.0
jakarta commons-collections 3.2.1
jakarta commons-logging 1.1.1
ezmorph 1.0.6

三、主要用法:
首先,要说明一下java对象与json字符串之间的简单对应关系如下:
java json-lib javascript
-----------------------------------------
Bean <=> JSONObject <=> {}
Bean[] <=> JSONArray <=> []
(注:Bean这在这里指单个Bean对象,Bean[]在这里指Bean数组/列表/集合。)

然后定义用于要用到的beanClass类及json string:
成员为primitive type的类
public class Product {
	private String id;
	private int barcode;
	private double price;
	private boolean expired;

	public Product() {

	}

	public Product(String id, int barcode, double price, boolean expired) {
		this.id = id;
		this.barcode = barcode;
		this.price = price;
		this.expired = expired;
	}

	// getters and setters
	...
}


成员为class type的类:(Staff类的成员department为Department类型)
public class Staff {
	private String id;
	private String name;
	private Department department;

	public Staff() {

	}

	public Staff(String id, String name, Department department) {
		this.id = id;
		this.name = name;
		this.department = department;
	}
	
	// getters and setters
	...
}

public class Department {
	private String id;
	private String name;

	public Department() {

	}

	public Department(String id, String name) {
		this.id = id;
		this.name = name;
	}
	
	// getters and setters
	...
}


生成对象:
Product product1 = new Product("pro001", 1111111, 100.00, false);
Product product2 = new Product("pro002", 2222222, 200.00, true);
Product[] products = {product1, product2};

Department department1 = new Department("dept001", "Martin's department");
Staff staff1 = new Staff("staff001", "Martin", department1);
Department department2 = new Department("dept001", "Flower's department");
Staff staff2 = new Staff("staff002", "Flower", department2);
Staff[] staffs = {staff1, staff2};


最后,举例说明java对象与json字符串之间如何转换。java对象与json之间的转换主要有以下四种:
(1)使用JSONObject.fromObject()方法:
//把单个Product对象转为JSONObject对象
JSONObject jsonProduct = JSONObject.fromObject(product1);
System.out.println(jsonProduct.toString());

得到:
{"barcode":1111111,"expired":false,"id":"pro001","price":100}


(2)使用JSONObject.toBean()方法:
1、当beanClass里的所有成员为原生类型(primitive type)时,即是int,boolean等类型,一般也把String当做原生类型处理。
//把前面的把JSONObject对象转回单个Product对象
Product productTest = (Product) JSONObject.toBean(jsonProduct, Product.class);


2、当beanClass里有成员为Class类型的时,即是多层Class的嵌套。
//定义一个Map类型的classMap,其key为成员的变量名,其value为成员的类型名
HashMap<String, Object> classMap = new HashMap<String, Object>();
classMap.put("department", Department.class);
//把Staff对象转为JsonObject
JSONObject jsonStaff = JSONObject.fromObject(staff1);
System.out.println(jsonStaff.toString());

得到:
{"department":{"id":"dept001","name":"Martin's department"},"id":"staff001","name":"Martin"}

//再把JsonObject转回Staff
Staff staffTest = (Staff) JSONObject.toBean(jsonStaff, Staff.class, classMap);

(3)多个Bean转为json,多个Bean对象包括列表/集合/数组,这里仅以数组为例,使用方法与(1)类似,但改为使用JSONArray.fromObject()方法:
JSONArray jsonProducts = JSONArray.fromObject(products);
System.out.println(jsonProducts.toString());

得到:
[{"barcode":1111111,"expired":false,"id":"pro001","price":100},{"barcode":2222222,"expired":true,"id":"pro002","price":200}]

(4)json转为多个Bean对象,多个Bean对象包括列表/集合/数组,这里仅以数组为例。使用方法与(2)类似,但改为使用JSONArray.toArray()方法:
1、当beanClass里的所有成员为原生类型(primitive type)时
Product[] productsTest = (Product[]) JSONArray.toArray(jsonProducts, Product.class);


2、当beanClass里有成员为Class类型的时,即是多层Class的嵌套。
JSONArray jsonStaffs = JSONArray.fromObject(staffs);
System.out.println(jsonStaffs.toString());

得到:
[{"department":{"id":"dept001","name":"Martin's department"},"id":"staff001","name":"Martin"},{"department":{"id":"dept001","name":"Flower's department"},"id":"staff002","name":"Flower"}]


//再把JsonArray转回Staff[]
Staff[] staffsTest = (Staff[]) JSONArray.toArray(jsonStaffs, Staff.class, classMap);



四、注意事项:
(1)在定义bean类时,必须确保证对于每个成员,都提供public的set/get方法。
(2)bean转为json时,返回值为JSONObject或者JSONArray类型的对象,这时可调用toString()方法得到json字符串。
(3)json转为bean时,返回值为object类型,必须进行强制转换转为beanClass,即(Product) JSONOjbect.toBean。如果是多个bean,应强制转换为beanClass数组,即(Product[]) JSONArray.toArray()。
(4)在将json转换为bean时,bean中必须有无参构造函数,否则会报找不到初始化方法的错误:
Exception in thread "main" net.sf.json.JSONException: java.lang.NoSuchMethodException: Product.<init>()
	at net.sf.json.JSONObject.toBean(JSONObject.java:288)
	at net.sf.json.JSONObject.toBean(JSONObject.java:233)
	at Tester.main(Tester.java:21)
Caused by: java.lang.NoSuchMethodException: Product.<init>()
	at java.lang.Class.getConstructor0(Class.java:2813)
	at java.lang.Class.getDeclaredConstructor(Class.java:2053)
	at net.sf.json.util.NewBeanInstanceStrategy$DefaultNewBeanInstanceStrategy.newInstance(NewBeanInstanceStrategy.java:55)
	at net.sf.json.JSONObject.toBean(JSONObject.java:282)
	... 2 more
分享到:
评论

相关推荐

    ezmorph-1.0.6.jar

    使用json时候将会用到的一个jar包,发现这个包在网上提供的比较少....EZMorph支持原始数据类型(Primitive),对象(Object),多维护数组转换与DynaBeans的转换。兼容JDK1.3.1,整个类库大小只有76K左右。

    apt-mirror-api-0.1.jar

    Files contained in apt-mirror-api-0.1.jar: META-INF/MANIFEST.MF META-INF/maven/com.moparisthebest.aptIn16/apt-mirror-api/pom.properties META-INF/maven/...

    java jdk18 签名算法jar bcprov-jdk18on-1.72.jar

    org.springframework.web.util.NestedServletException: Handler ... nested exception is java.lang.NoSuchMethodError: org.bouncycastle.asn1.ASN1InputStream.readObject()Lorg/bouncycastle/asn1/ASN1Primitive;

    ezmorph.jar v1.0.6免费版.zip

    ezmorph.jar包是在使用json时候将会用到jar包,缺少这个包可能导致Could not initialize class net.sf.json.JsonConfig,给大家提供ezmorph-1.0.6.jar,有需要的赶快下载吧! ezmorph.jar基本简介 EZMorph是一个...

    JSON与JAVA数据的转换

    - 在Java中进行JSON与Java数据之间的转换,可以使用多种库,如`Jackson`、`Gson`、`JSON-lib`等。本例中提到的是`JSON-lib`库,它是一个早期较为流行的JSON处理库之一。 - `JSON-lib`依赖于其他几个库,如`org....

    ezmorph-1.0.6.jar包

    EZMorph是一个简单的java类库用于将一种...EZMorph原先是Json-lib项目中的转换器。EZMorph支持原始数据类型(Primitive),对象(Object),多维数组转换与DynaBeans的转换。兼容JDK1.3.1,整个类库大小只有76K左右。

    阿里云Elasticsearch7.x jar包.zip

    - `hppc-0.8.1.jar`:High-Performance Primitive Collections,是Elasticsearch使用的一个Java库,提供了高性能的原始数据类型的集合,如数组、队列和映射,用于内存效率高的数据操作。 - `parent-join-client-...

    【IT十八掌徐培成】Java基础第02天-03.数据类型-强制类型转换.zip

    数据类型-强制类型转换”主要探讨了Java中的数据类型转换,特别是强制类型转换。 1. 基本数据类型: - 整型:byte(1字节),short(2字节),int(4字节),long(8字节) - 浮点型:float(4字节),double(8...

    axis2-1.4.1.jar.zip

    不要在定义 wsdl 时使用 byte, int, long 等 primitive 数据类型的数组,而应该使用 base64Binary 类型。 因为从上面的例子不难看出对一上字节进行表达的 soap 消息使用了过多的冗余信息,极有可能导致效率问题。 ...

    elasticsearch5.5.1客户端所需jar包,解决必须用maven工程问题

    5. **Hppc-0.7.1.jar**:High Performance Primitive Collections,一个用于存储和处理基本数据类型的Java库,Elasticsearch用它来优化内存使用和提高性能。 6. **Httpclient-4.5.2.jar**:Apache HttpClient是一个...

    ezmorph-1.0.6.zip

    ezmorph-1.0.6.jar ezmorph是一个简单的java类库用于将一种对象转换成另外一种对象...ezmorph原先是Json-lib项目中的转换器。EZMorph支持原始数据类型(Primitive),对象(Object),多维数组转换与DynaBeans的转换。

    JAVA-LAB-ASSIGNMENT.rar_assignment

    它们之间的转换,比如自动装箱和拆箱,是Java中重要的特性。 2. **reverse.class**: 可能是一个实现字符串或数组反转的程序。在Java中,可以通过遍历数组或字符串并反向添加元素来实现这一操作,这是一个常见的...

    elasticsearch所需jar包

    1. **hppc-0.7.1.jar**:High Performance Primitive Collections,它提供了高性能的原生数据类型集合,如数组、队列和散列表,用于Elasticsearch内部的数据处理和存储。 2. **jackson-dataformat-smile-2.8.1.jar*...

    JAVA-type.rar_java Type

    在"JAVA-type.rar_java Type"压缩包中,重点讲解的是Java的基本数据类型转换,这包括了数值类型之间的转换以及基本类型与包装类的转换。 一、Java基本数据类型 1. 整型(Integer Types):byte(1字节)、short(2...

    cesium-sensors-master.zip

    《Cesium动态雷达扫描源码解析与应用》 Cesium是一个强大的开源JavaScript库,用于创建交互式的3D地球浏览器。在“cesium-sensors-master.zip”这个压缩包中,我们得到了Cesium的一个扩展,它实现了动态雷达扫描的...

    ISO10303-42-2003.pdf

    在该标准中,几何学和拓扑学表示是指对产品数据的几何学和拓扑学特性的描述,包括点、线、面、体等几何学primitive,以及拓扑学关系,如连接、相交等。STEP文件定义解释是指对STEP文件格式的定义和解释,包括文件...

    Java-IEEE-2012-basepapers-List-2.zip_site:www.pudn.com

    标题中的"Java-IEEE-2012-basepapers-List-2.zip"表明这是一个包含Java相关研究论文的压缩文件,源自IEEE(电气和电子工程师协会)2012年的资源,通常这些论文代表了该领域的先进技术和理论研究。"site:...

    ch02-primitive-data-definite-loops.pdf

    这份文件是一份标题为“ch02-primitive-data-definite-loops.pdf”的文档的内容摘要,摘自《Building Java Programs》书籍的第2章,具体讲的是Java基础入门的1-18章节。文档中提到了Java的数据类型,包括原始数据...

    DRAW-PRIMITIVE.zip_draw primitive_things

    2. **循环与条件语句**:利用`for`、`while`等循环结构以及`if`、`else`等条件判断,控制字符的输出位置和顺序,以构建图形的轮廓。 3. **坐标系统**:通常在控制台中,(0,0)位于左上角,x轴向右增长,y轴向下增长...

    PyPI 官网下载 | stmbplus_thinclient_primitive-1.0.tar.gz

    标题中的"PyPI 官网下载 | stmbplus_thinclient_primitive-1.0.tar.gz"指的是Python Package Index (PyPI) 上的一个软件包。PyPI是Python开发者发布和分享他们编写的Python库的地方,方便其他用户安装和使用。这个...

Global site tag (gtag.js) - Google Analytics