Java创建和解析Json数据方法(三)——json-lib包的使用

来源:互联网 发布:阿依莲正品淘宝折扣店 编辑:程序博客网 时间:2024/06/06 03:56

(三)json-lib包的使用

        这篇笔记主要介绍json-lib包的创建和解析json数据的方式,主要是的JSONObject、JSONArray和Java对象:beans, maps, collections, java arrays等的转换。

1.简介

        json-lib包是一个构造和解析json的类库,提供将Java对象:beans, maps, collections, java arrays and XML等等转换成JSON数据,或者反向转换的功能。 json-lib包的下载地址:http://sourceforge.net/projects/json-lib/files/
        json-lib包的使用需要依赖下面的工具包:
  • jakarta commons-lang 2.5 下载地址:http://commons.apache.org/proper/commons-lang/
  • jakarta commons-beanutils 1.8.0 下载地址:http://commons.apache.org/proper/commons-beanutils/
  • jakarta commons-collections 3.2.1 下载地址:http://commons.apache.org/proper/commons-collections/
  • jakarta commons-logging 1.1.1 下载地址:http://commons.apache.org/proper/commons-logging/
  • ezmorph 1.0.6 下载地址:http://sourceforge.net/projects/ezmorph/files/
这里打包了一份完整的工具包:

2.构造JSONObject和JSONArray

给出一个下面会用到的Student类:
[java] view plain copy
  1. package jsonlib;  
  2. public class Student {  
  3.     private String name;  
  4.     private String sex;  
  5.     private int age;  
  6.     public String getName() {  
  7.         return name;  
  8.     }  
  9.     public void setName(String name) {  
  10.         this.name = name;  
  11.     }  
  12.     public String getSex() {  
  13.         return sex;  
  14.     }  
  15.     public void setSex(String sex) {  
  16.         this.sex = sex;  
  17.     }  
  18.     public int getAge() {  
  19.         return age;  
  20.     }  
  21.     public void setAge(int age) {  
  22.         this.age = age;  
  23.     }  
  24. }  
2.1 fromObject(Object object)方法
        json-lib包中JSONObject和JSONArray类都有一个fromObject(Object object)的静态方法,即可以从参数object中构造json对象或数组。
        ①JSONObject.fromObject(Object object)中,参数可以是String、Map、beans等,不可以是collection、java arrays等
        ②JSONArray.fromObject(Object object)中,参数可以是String、Map、Colliection、collection、java arrays等
代码例子如下:
[java] view plain copy
  1. package jsonlib;  
  2. import java.util.ArrayList;  
  3. import java.util.HashMap;  
  4. import java.util.List;  
  5. import java.util.Map;  
  6. import net.sf.json.*;  
  7. public class JsonlibTest {  
  8.     public static void main(String[] args) {  
  9.         //String构造JSONObject  
  10.         String name = "{'name':'JTZen9'}";  
  11.         JSONObject jsonObject3 = JSONObject.fromObject(name);  
  12.         System.out.println(jsonObject3);  
  13.           
  14.         //Java Array构造JSONArray  
  15.         String[] strings = {"1","2","3"};  
  16.         JSONArray jsonArray1 = JSONArray.fromObject(strings);  
  17.         System.out.println(jsonArray1);  
  18.           
  19.         //Beans构造JSONObject  
  20.         Student student = new Student();  
  21.         student.setAge(21);  
  22.         student.setName("JTZen9");  
  23.         student.setSex("male");  
  24.         JSONObject jsonObject1 = JSONObject.fromObject(student);  
  25.         System.out.println(jsonObject1);  
  26.           
  27.         //Map构造JSONObject  
  28.         Map<string object=""> map = new HashMap<string object="">();  
  29.         map.put("name""JTZen9");  
  30.         map.put("num", strings);  
  31.         JSONObject jsonObject2 = JSONObject.fromObject(map);  
  32.         System.out.println(jsonObject2);  
  33.           
  34.         //List构造JSONObject  
  35.         List<object> list = new ArrayList</object><object>();  
  36.         list.add("JTZen9");  
  37.         list.add(strings);  
  38.         list.add(map);  
  39.         list.add(student);  
  40.         JSONArray jsonArray2 = JSONArray.fromObject(list);  
  41.         System.out.println(jsonArray2);  
  42.     }  
  43. }  

输出的结果:


注意:
        ①当使用String转JSON时,如果是json对象,那么String必须是符合JSON对象的格式,同理,JSONArray也一样。
        ②如果传入fromObject(Object object)中的参数是其他类型,比如说int、double、boolean、或者不符合json格式的String,就会将生产空的JSONObject对象。详情可下载json-lib包查看fromObject方法的源代码。

2.2 其他方法

JSONObject类:
        put()方法和accumulate()方法,其实和org.json包的用法类似:
        ①put()方法,向json对象中加入字段和相应值,会覆盖原来的值。
        ②accumulate()方法,向json对象和数组中的某字段追加相应值,不会覆盖原来的值。
JSONArray类:
        add()方法,和org.json包中JSONArrray类的put()方法类似,在json数组末尾追加元素,也可以在指定位置追加。
[java] view plain copy
  1. package jsonlib;  
  2. import java.util.HashMap;  
  3. import java.util.Map;  
  4. import net.sf.json.*;  
  5. public class JsonlibTest {  
  6.     public static void main(String[] args) {  
  7.         Map<string object=""> map = new HashMap<string object="">();  
  8.         map.put("name""JTZen9");  
  9.         map.put("age"21);  
  10.         Student student = new Student();  
  11.         student.setAge(21);  
  12.         student.setName("JTZen9");  
  13.         student.setSex("male");  
  14.           
  15.         JSONObject jsonObject = new JSONObject();  
  16.         jsonObject.put("name""JTZen9");  
  17.         System.out.println(jsonObject);  
  18.         jsonObject.put("student", student);  
  19.         System.out.println(jsonObject);  
  20.           
  21.         JSONArray jsonArray = new JSONArray();  
  22.         jsonArray.add("JTZen9");  
  23.         jsonArray.add(map);  
  24.         jsonArray.add(0,student); //在指定位置加入  
  25.         System.out.println(jsonArray);  
  26.     }  
  27. }  
运行结果:

json-lib包构造json对象和数组,还有一个element()方法,在JSONObject类中与put()类似,在JSONArray类中与add()类似,更具体的差别往后有深入研究在继续记录。

3.JSON数据解析

        json-lib包中使用JSONObject和JSONArray类解析json数据与org.json包类似,同样是使用各种getXXX()方法和optXXX()方法。
        ①getXXX()方法:如getJSONObject、getJSONArray、getInt等,如果key不存在的话,就会抛出异常。
        ②optXXX()方法:如optBoolean、optString、optInt等,如果包含key这个字段,那么返回这个字段的值,否则返回一个默认值。
[java] view plain copy
  1. package jsonlib;  
  2. import net.sf.json.*;  
  3. public class JsonlibTest {  
  4.     public static void main(String[] args) {  
  5.         String jsonData = "{'name':'JTZen9','age':21}";  
  6.         JSONObject jsonObject = JSONObject.fromObject(jsonData);  
  7.         System.out.println(jsonObject);  
  8.         String nameStr = jsonObject.getString("name");  
  9.         System.out.println(nameStr);  
  10.         int ageInt = jsonObject.optInt("age");  
  11.         System.out.println(ageInt);  
  12.           
  13.         String sexStr1 = jsonObject.optString("sex");  
  14.         System.out.println("optString('sex')输出的:" + sexStr1); //默认值为空  
  15.         String sexStr2 = jsonObject.getString("sex");  
  16.         System.out.println(sexStr2);      //报错  
  17.     }  
  18. }  
输出结果:

        因为有的时候,抛出异常会出现各种error信息,影响用户体验或者影响开发员人的下一步操作,所以这种时候就最好是使用optXXX()方法。

既然json-lib包比org.json包重量级,那么json-lib包肯定有很多org.json包没有的类和方法,这篇笔记简单记录json-lib包中,json数据转换为java bean、Collection、java array等的方法。

1.json-lib包与org.json包

        ①org.json包比json-lib包要轻量级,不需要依赖各种工具包;
        ②将Java对象(beans, maps, collections, java arrays等)转换为json数据时,两者的功能差不多;
        ③同样拥有各种getXXX()和optXXX()方法等来解析json数据;
        ④json-lib包可直接将json数据转换为java bean、Collection、java array等

2.解析json对象

        沿用上篇笔记的Student类:
2.1 json数据转为bean类
例子:
[java] view plain copy
  1. package jsonlib;  
  2. import net.sf.json.*;  
  3. public class JsonlibTest {  
  4.     public static void main(String[] args) {  
  5.         // 创建一个bean  
  6.         Student student = new Student();   
  7.         student.setName("JTZen9");  
  8.         student.setAge(21);  
  9.         student.setSex("male");  
  10.         // bean类转为json对象  
  11.         JSONObject jsonObject = JSONObject.fromObject(student);   
  12.         System.out.println(jsonObject);  
  13.         // 方法一,json对象转为bean类  
  14.         Student student2 = (Student) JSONObject.toBean(jsonObject, Student.class);  
  15.         System.out.println(student2.getName() + " " + student2.getAge() + " " + student2.getSex());  
  16.         // 方法二  
  17.         JsonConfig jsonConfig = new JsonConfig();  
  18.         jsonConfig.setRootClass(Student.class);  
  19.         Student student3 = (Student) JSONObject.toBean(jsonObject, jsonConfig);  
  20.         System.out.println(student3.getName() + " " + student3.getAge() + " " + student3.getSex());  
  21.     }  
  22. }  
输出结果:
2.2 json数据转为List类
例子:
[java] view plain copy
  1. package jsonlib;  
  2. import java.util.ArrayList;  
  3. import java.util.List;  
  4. import net.sf.json.*;  
  5. public class JsonlibTest {  
  6.     public static void main(String[] args) {  
  7.         List<string> list = new ArrayList<string>();  
  8.         list.add("JTZen9");  
  9.         list.add("heiheihei");  
  10.         list.add("DSMGYH");  
  11.         JSONArray jsonArray = JSONArray.fromObject(list);  
  12.         System.out.println(jsonArray);  
  13.         List<string> list2 = (List<string>) JSONArray.toList(jsonArray);  
  14.         System.out.println(list2.get(0) + " " + list2.get(1) + " " + list2.get(2));  
  15.   
  16.         List<student> listStudent = new ArrayList<student>();  
  17.         for (int i = 0; i < 3; i++) {  
  18.             Student student = new Student();  
  19.             student.setName("JTZen9" + i);  
  20.             student.setAge(i);  
  21.             student.setSex("male");  
  22.             listStudent.add(student);  
  23.         }  
  24.         JSONArray sJsonArray = JSONArray.fromObject(listStudent);  
  25.         System.out.println(sJsonArray);  
  26.         // JSONArray转换为List<student>,方法一  
  27.         List<student> sList1 = (List<student>) JSONArray.toList(sJsonArray, Student.class);  
  28.         System.out.println(sList1.get(1).getAge());  
  29.         // 方法二  
  30.         JsonConfig jsonConfig = new JsonConfig();  
  31.         jsonConfig.setRootClass(Student.class);  
  32.         List<student> sList2 = (List<student>) JSONSerializer.toJava(sJsonArray, jsonConfig);  
  33.         System.out.println(sList2.get(1).getAge());  
  34.     }  
  35. }  
输出结果:

3.jsonConfig类

        jsonConfig类是帮助配置序列化过程的实用程序类,可以用它来在json和java对象转换过程中进行一些配置设置。
例如:当我们将一个java bean类转换为json对象时,往往会把bean类中所有的属性字段转为json对象的相应字段。如果我们要过滤掉bean类中的一些属性的时候呢,就可以使用jsonConfig类。
[java] view plain copy
  1. package jsonlib;  
  2. import net.sf.json.*;  
  3. public class JsonlibTest {  
  4.     public static void main(String[] args) {  
  5.         Student student = new Student();  
  6.         student.setName("JTZen9");  
  7.         student.setSex("male");  
  8.         student.setAge(21);  
  9.         JSONObject jsonObject1 = JSONObject.fromObject(student);  
  10.         System.out.println(jsonObject1);   //正常输出三个字段  
  11.           
  12.         JsonConfig jsonConfig = new JsonConfig();  
  13.         jsonConfig.setExcludes(new String[]{ "sex" });  //过滤要输出的字段  
  14.         JSONObject jsonObject2 = JSONObject.fromObject(student, jsonConfig);  
  15.         System.out.println(jsonObject2.toString());  
  16.     }  
  17. }  
输出结果如下(过滤了sex字段):


jsonConfig类还有很多其他的用法,以后用到的时候在继续完善。

4.结束语

        json-lib包,比org.json包具有的功能要多,很多方法日后用到再记录。
        可以根据需求选择不同的工具包,org.json包比较轻量级,但实现的功能有限,如果只是简单的转换java对象为json数据,那么org.json包就足够了。

原文地址:
http://blog.csdn.net/Zen99T/article/details/50496429
http://blog.csdn.net/Zen99T/article/details/50511099

阅读全文
1 0