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

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]





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值