您的位置:首页 > 编程语言 > Java开发

Java、Json转换方式之一:json-lib

2013-04-25 10:09 766 查看
json-lib能把Java对象转换为Json,也可以把Json字符串转换为Java对象。

准备工作:

  下载jar包:http://sourceforge.net/projects/json-lib/files/json-lib/json-lib-2.4/

  本例使用2.3版本,也可以使用2.4版本。

  依赖包(都是Apache下的开源项目包):  

    jakarta commons-lang 2.5

    jakarta commons-beanutils 1.8.0

    jakarta commons-collections 3.2.1

    jakarta commons-logging 1.1.1

  要使用的JavaBean:Student类  

public class Student {
private int id;
private String name;
private String email;
private String address;
private Birthday birthday;

public String toString() {
return this.name + "#" + this.id + "#" + this.address + "#" + this.birthday + "#" + this.email;
}
}


  和Birthday类:  

public class Birthday {
private String birthday;

public Birthday(String birthday) {
super();
this.birthday = birthday;
}

public Birthday() {
}

@Override
public String toString() {
return this.birthday;
}
}


  

开始进行解析和转换:

  建立测试类,并在init()中初始化数据,destory()中销毁数据:

public class JsonTest {
private JSONArray jsonArray = null;
private JSONObject jsonObject = null;
private Student student = null;
private String json = "{\"address\":\"beijing\",\"age\":21,\"birthday\":{\"birthday\":\"2012-12-12\"},\"email\":\"li150@163.com\",\"name\":\"liheng\"}";

private void init() {
jsonArray = new JSONArray();
jsonObject = new JSONObject();
student = new Student() {
{
setAddress("beijing");
setAge(21);
setEmail("li150@163.com");
setName("liheng");
setBirthday(new Birthday("2012-12-12"));
}
};
}

public void destory() {
jsonArray = null;
jsonObject = null;
student = null;
System.gc();
}
}


  

  接下来的工作,就是在JsonTest中建立各个方法,然后测试并输出。我这里总结了JavaBean到Json的各种转换方式,贴出来以供参考:

/**
* 将java对象转换为json字符串:三种方式
* JSONObject和JSONSerializer返回的一样。大致为:{"name":"n","age":12}
* JSONArray为:[{"name":"n","age":12}]
*/
public void javaToJson() {
JSONObject.fromObject(student).toString();
JSONArray.fromObject(student).toString();
JSONSerializer.toJSON(student).toString();
}

/**
* list转换为json。对于集合,只能使用JSONArray和JSONSerializer
* 返回的结果大致:[{"name":"n","age":12},{"name":"n","age":12}]
*/
public void listToJson() {
List<Student> list = new ArrayList<Student>();
list.add(student);
list.add(student);
System.out.println(JSONArray.fromObject(list));
System.out.println(JSONSerializer.toJSON(list));
}

/**
* map转换为json。对于function()则不加引号,按照js的规则
*/
public void mapToJson() {
Map<String, Object> map = new HashMap<String, Object>();
map.put("A", student);
student.setName("jack");
map.put("B", student);
map.put("name", "json");
map.put("bool", Boolean.TRUE);
map.put("int", new Integer(1));
map.put("arr", new String[] { "a", "b" });
map.put("func", "function(i){ return this.arr[i]; }");

System.out.println(JSONObject.fromObject(map));
System.out.println(JSONArray.fromObject(map));
System.out.println(JSONSerializer.toJSON(map));
}

/**
* 更多的类型转换为json,参考上面
*/

/**
* json字符串转换为Java对象
*/
public void jsonToJava() {
json = "{\"address\":\"beijing\",\"age\":21,\"birthday\":{\"birthday\":\"2012-12-12\"},\"email\":\"li150@163.com\",\"name\":\"liheng\"}";
jsonObject = JSONObject.fromObject(json);
Student stu = (Student) JSONObject.toBean(jsonObject, Student.class);
stu = (Student) JSONSerializer.toJava(JSONSerializer.toJSON(json));
}

/**
* 将json转换为数组,使用JSONArray.toArray(): 1、jsonArray =
* JSONArray.fromObject(json); 2、Object[] os = jsonArray.toArray();
*
* 将json转换为list,使用JSONArray.toList(): 1、jsonArray =
* JSONArray.fromObject(json); 2、List<Student> list =
* JSONArray.toList(jsonArray, Student.class);
*  上面转换为List的方法已经过时。使用下面的方法:
*          1、jsonArray = JSONArray.fromObject(json);
*        2、JSONArray.toList(jsonArray, new Person(), new JsonConfig());//参数1为要转换的JSONArray数据,参数2为要转换的目标数据,即List盛装的数据
*
* 将json转换为map,较为麻烦,但也不常用;
*      json = "{\"arr\":[\"a\",\"b\"],\"A\":{\"address\":\"address\",\"birthday\":{\"birthday\":\"2010-11-22\"},"
+ "\"email\":\"email\",\"id\":1,\"name\":\"jack\"},\"int\":1,"
+ "\"B\":{\"address\":\"address\",\"birthday\":{\"birthday\":\"2010-11-22\"},"
+ "\"email\":\"email\",\"id\":1,\"name\":\"jack\"},\"name\":\"json\",\"bool\":true}";
jsonObject = JSONObject.fromObject(json);
Map<String, Class<?>> clazzMap = new HashMap<String, Class<?>>();
clazzMap.put("arr", String[].class);
clazzMap.put("A", Student.class);
clazzMap.put("B", Student.class);
Map<String, ?> mapBean = (Map) JSONObject.toBean(jsonObject, Map.class, clazzMap);
System.out.println(mapBean);

Set<String> set = mapBean.keySet();
Iterator<String> iter = set.iterator();
while (iter.hasNext()) {
String key = iter.next();
fail(key + ":" + mapBean.get(key).toString());
}
*
*/


  最后,可以在main()方法中进行测试:  

public static void main(String[] args) {
JsonTest t = new JsonTest();
t.init();
t.mapToJson();
}


自我思考:json-lib解析方式比较保守,估计是使用Java反射和字符串拆解来进行的解析。解析速度一般,使用简洁性一般。

下面介绍JavaBean转换Json的另一种方式,也是Spring MVC内置使用的解析方式:Jackson。

  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: