json-lib-xxx.jar包必需5个依赖包(实测):
ezmorph-xxx.jar
commons-lang-xxx.jar
commons-beanutils-xxx.jar
commons-collections-xxx.jar
commons-logging-xxx.jar
maven项目导入json-lib-xxx.jar及其5个依赖包只需一条语句:
<dependency>
<groupId>net.sf.json-lib</groupId>
<artifactId>json-lib</artifactId>
<version>2.4</version>
<classifier>jdk15</classifier>
</dependency>
常用的方法有几个:JSONObject.fromObject(); 转为JSONObject类型。处理类型JavaBean、键为任意类型的Map
JSONObject.toBean();
JSONObject.toString();
JSONArray.fromObject(); 转为JSONArray类型。处理类型JavaBean、键为任意类型的Map、任意类型的数组、List<JavaBean>、List<Map>
JSONArray.toArray();
JSONArray.toCollection();
JSONObject.toString();
JSONSerializer.toJSON(); 转为JSON类型,因为JSON是接口,JSONObject、JSONArray是它的两个实现类,所以根据传入的参数不同,可以强转为这两种类型。如果传入单个JavaBean对象,就可以强转为JSONObject类型;如果传入一个List对象,则可以强转为JSONArray类型。如果不强转,打印出来的话也会自动转为正确类型的。
以 { 左大括号开始,以 } 右大括号结束,中间以冒号及逗号分隔的字符串也可以转成JSONObject类型:
String str = "{'name':'zhangsan','age':18}";
str="{name:'zhangsan',age:18}";
//字符串中的键可以没有单引号或者双引号括住,但是值如果是字符串的话,还是必须要有单引号或是双引号括住的
//此外,字符串中任意位置(非键或者值内部)是可以有任意数量空格的,fromObject()方法会自动去掉空格、添加双引号的
JSONObject jSONObject = JSONObject.fromObject(str);
System.out.println(jSONObject);
打印结果是:{"name":"zhangsan","age":18}
以 [ 中括号开始,以 ] 右中括号结束、中间以逗号分隔的字符串也可以转成JSONArray类型:
String str = "['zhangsan',1,2.5,true]";
JSONArray jSONArray = JSONArray.fromObject(str);
System.out.println(jSONArray);
if (jSONArray != null && jSONArray.size() > 0) {
for (int i = 0; i < jSONArray.size(); i++) {
System.out.println(jSONArray.get(i));
System.out.println(jSONArray.get(i).getClass().getName());
}
}
打印结果是:["zhangsan",1,2.5,true]zhangsan
java.lang.String
1
java.lang.Integer
2.5
java.lang.Double
true
java.lang.Boolean
JSONObject对象new出来之后添加元素的两种方式:
1.当成一个map,用put(String,Object)方法:
JSONObject jsonObject = new JSONObject();
jsonObject.put("name", "zhangsan");
jsonObject.put("age", 21);
jsonObject.put("salary", 5000.5);
jsonObject.put("boolean", true);
System.out.println(jsonObject);
打印结果是:{"name":"zhangsan","age":21,"salary":5000.5,"boolean":true}
2.用element(String,Object)方法:
JSONObject jsonObject = new JSONObject().element("name", "zhangsan").element("age", 21)
.element("salary", 5000.5).element("boolean", true);
System.out.println(jsonObject);
打印结果也是:{"name":"zhangsan","age":21,"salary":5000.5,"boolean":true}
对比得知,element(String,Object)方法更加简单。
JSONArray对象new出来后添加元素也有两种方式:
1.当成一个list,用add(Object)方法:
JSONArray jsonArray = new JSONArray();
jsonArray.add("zhangsan");
jsonArray.add(18);
jsonArray.add(5000.5);
jsonArray.add(true);
System.out.println(jsonArray);
for (int i = 0; i < jsonArray.size(); i++) {
Object o = jsonArray.get(i);
System.out.println(o + "----" + o.getClass().getName());
}
打印结果是:["zhangsan",18,5000.5,true]zhangsan----java.lang.String
18----java.lang.Integer
5000.5----java.lang.Double
true----java.lang.Boolean
2.使用用element(Object)方法:
JSONArray jsonArray = new JSONArray().element("zhangsan").element(18).element(5000.5).element(true);
System.out.println(jsonArray);
for (int i = 0; i < jsonArray.size(); i++) {
Object o = jsonArray.get(i);
System.out.println(o + "----" + o.getClass().getName());
}
打印结果也是:["zhangsan",18,5000.5,true]zhangsan----java.lang.String
18----java.lang.Integer
5000.5----java.lang.Double
true----java.lang.Boolean
通过对比得知,还是element(Object)方法简便些。
二. 把JSONObject、JSONArray转换成JavaBean等等
1.JSONObject.toBean( JSONObject jsonObject, Class beanClass ),此处的JSONObject对象可以是new 出来的,也可以是通过fromObject()由各种类型转(JavaBean、Map、特殊格式的String等等)换过来的:、
@Test
public void readJSON2Bean() {
//可以看出以下两种格式的字符串都可以转换成JSONObject
String json = "{\"name\":\"zhangsan\",\"age\":18,\"salary\":5000.5}";
String json2 = "{'name':'lisi','age':20,'salary':4000.5}";
JSONObject jsonObject = JSONObject.fromObject(json);
JSONObject jsonObject2 = JSONObject.fromObject(json2);
Person person = (Person) JSONObject.toBean(jsonObject, Person.class);
System.out.println(person);
Person person2 = (Person) JSONObject.toBean(jsonObject2, Person.class);
System.out.println(person2);
}
注意,toBean()的第二个参数即要转换成的实体类实例不要省略,如果省略了得到的类型就不是我们自己创建的实体类类型了,而是json-lib框架自带的net.sf.ezmorph.bean.MorphDynaBean类型了。
2.JSONObject.toBean(JSONObject jsonObject, Class beanClass, Map classMap)静态方法将JSONObject对象转换成Map对象:
@Test
public void readJSON2Map() {
String json = "{\"name\":\"zhangsan\",\"age\":18,\"salary\":5000.5}";
JSONObject jsonObject = JSONObject.fromObject(json);
Map<String, Class<Person>> clazzMap = new HashMap<String, Class<Person>>();
clazzMap.put("ZHANGSAN", Person.class);
@SuppressWarnings("unchecked")
Map<String, Object> map = (Map<String, Object>) JSONObject.toBean(jsonObject, Map.class, clazzMap);
System.out.println(map);
}
打印结果是:{age=18, name=zhangsan, salary=5000.5}
注意,第三个参数有以下要求:键只能是字符串,值只能是类实例,如上例中的clazzMap.put("ZHANGSAN",Person.class)。
3.JSONArray.toArray(JSONArray jsonArray, Class objectClass) 静态方法将JSONArray对象转换成数组,同理,JSONArray对象可以是new出来的,也可以是通过fromObject()由各种类型转换过来的:
@Test
public void readJSON2Array() {
String json = "{\"name\":\"zhangsan\",\"age\":18,\"salary\":5000.5}";
json = "[" + json + "]";
// 把特殊字符串转换成JSONArray
JSONArray jsonArray = JSONArray.fromObject(json);
// 利用JSONArray的toArray(JSONArray jsonArray, Class objectClass) 静态方法
Person[] persons = (Person[]) JSONArray.toArray(jsonArray, Person.class);
if (persons != null && persons.length > 0) {
System.out.println(persons[0]);
}
}
打印结果是:Person [name=zhangsan, age=18, salary=5000.5]
4.JSONArray.toCollection(JSONArray jsonArray, Class objectClass)静态方法将JSONArray对象转换成Collection对象,再强转为List对象。
@Test
public void readJSON2List() {
String json = "{\"name\":\"zhangsan\",\"age\":18,\"salary\":5000.5}";
json = "[" + json + "]";
JSONArray jsonArray = JSONArray.fromObject(json);
@SuppressWarnings("unchecked")
Collection<Person> c = JSONArray.toCollection(jsonArray, Person.class);
List<Person> list = (List<Person>) c;
System.out.println(list);
if (list != null && list.size() > 0) {
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
打印结果是:[Person [name=zhangsan, age=18, salary=5000.5]]Person [name=zhangsan, age=18, salary=5000.5]