您的位置:首页 > Web前端 > JavaScript

json处理四部曲之第一曲:利用json-lib-xxx.jar处理json

2016-03-11 17:33 525 查看
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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: