在java开发中时常会遇到json与java对象转换的情况,比如说一般接口调用返回的都是json格式的,我们要取出来用就得把它解析成我们想要的格式,有时候我们传递参数又需要把参数封装成json。这两天调试API经常需要转换他们,也接触了两种解析工具,这里就简单的记录一下。
一:JSON-lib的使用
1. 下载JSON-lib所需要的jar包。下载地址:
http://download.csdn.net/download/eson_15/9514985
2. 如何把java对象封装成 json。
1)创建java对象。
public class Person {
private String name;
private int age;
private String info;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
2)创建一个带main方法的类进行测试。简单的json构造。
//java对象转换成json
//创建java对象
Person person=new Person();
person.setName("小周");
person.setAge(20);
person.setInfo("这是一个可爱的小宝宝");
//创建json对象
JSONObject jo=new JSONObject();
jo.put("name",person.getName());
jo.put("age", person.getAge());
jo.put("info", person.getInfo());
//将JSONObject转换成json。
String json=jo.toString();
System.out.println(json);
得到的结果是:
3)构造包含多个json对象和数组的json
//构造包含多层jsonObject和数组的接送对象
//构造第二个person JSONObject对象
JSONObject per=new JSONObject();
per.put("name","小刘");
per.put("age", 16);
per.put("info", "这是一个少年");
//构造person JSONObject数组
List<JSONObject> list=new ArrayList<JSONObject>();
list.add(jo); //jo是上一步创造的json对象
list.add(per);
//构造猫对象
JSONObject cat=new JSONObject();
cat.put("color", "黄色");
cat.put("sex", "公猫");
//构造总对象,其中包括一个person对象和一个cat对象和一组键值对
JSONObject anm=new JSONObject();
anm.put("person",list);
anm.put("cat",cat);
anm.put("dog", "这是一只大狗");
//将JSONObject转换成json。
String json1=anm.toString();
System.out.println(json1);
结果是:
{"person":[{"name":"小周","age":20,"info":"这是一个可爱的小宝宝"},{"name":"小刘 ","age":16,"info":"这是一个少年"}],"cat":{"颜色":"黄色","性别":"公猫"},"狗":"这是一 只大狗"}
这里可以看到,实际上我们可以不不创建一个java类就可以封装一个json。此外我们我 们可以用jo.put(Map map)方法直接把Map转换成json。
3. 解析json为java对象。
/*json转换成java对象*/
//创建json
String json2=json1;
//解析json jo 1为总json object,由上一步我们知道其中包括一个person JSONObject数组,一个cat JSONObject对象,一个键值对。
JSONObject jo1=JSONObject.fromObject(json2);
JSONArray PersonArray=(JSONArray) jo1.get("person"); //解析数组
JSONObject cat1=jo1.getJSONObject("cat"); //解析JSONObject
String dog=jo1.getString("dog"); //解析键值对
//对PersonArray进行解析
List<Person> personlist=new ArrayList<Person>();
for(int i=0;i<PersonArray.size();i++){
JSONObject personObject=(JSONObject) PersonArray.get(i);
Person p=new Person();
p.setName(personObject.getString("name")); //string 的解析
p.setAge(personObject.getInt("age")); //int的解析
p.setInfo(personObject.getString("info"));
personlist.add(p);
}
//cat1的解析
String co=cat1.getString("color");
String sex=cat.getString("sex");
System.out.println("猫的颜色是:"+co+" 性别是"+sex);
输出结果正确,说明解析成功。
其实我们发现也不必一定要创建java对象才能够进行解析,完全可以把json解析成单独的java类型。总之使用json-lib解析或封装json是完全可以不要封装java对象这一步骤的。
二:Gson的使用。
如果说json-lib只是单纯的对json进行解析和封装,那么json就的的确确是json和java对象之间的转换了,它省去了先解析再封装的过程,只需要一步,就能够实现json到java对象的转换。
1.下载gson需要的jar包。下载地址:http://download.csdn.net/detail/lyq8479/8451103
2.导入jar包,把解压得到的三个jar全都放到WEB-INF下的lib文件夹中去。
3.构建java对象,使用gson一定是需要先构造java对象,java对象需要按照json的格式来构造,具体方法上一篇文章讲过 http://blog.csdn.net/guozili1/article/details/53946384
这里还是以刚才得到的上一部分得到的包含数组和jsonObject对象的复杂json为例
{
"person": [
{
"name": "小周",
"age": 20,
"info": "这是一个可爱的小宝宝"
},
{
"name": "小刘",
"age": 16,
"info": "这是一个少年"
}
],
"cat": {
"color": "黄色",
"sex": "公猫"
},
"狗": "这是一只大狗"
}
分析json发现有四对{}和一对[],四对{}对应的是总object,两个person object和一个cat object,两个person object形成一个person object数组。所以在java中我们需要创建一个总对象,这个自己随便命名,就叫anm好了,还要创建一个cat对象,和一个person对象,这两个对象的名字也可以自己命名,但是最好以对应的{}外边的名字首字母大写命名。每个对象的属性值都要和键值对的key保持一致,如果是对象或者数组或者list,也要和对应的{}前边的名字或对应[]前边的名字一样。总类的属性是由person的list和cat对象和键值对的属性构成。最后的创建结果是:
Person.java
public class Person {
private String name;
private int age;
private String info;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getInfo() {
return info;
}
public void setInfo(String info) {
this.info = info;
}
}
Cat.java
public class Cat {
private String color;
private String sex;
public String getColor() {
return color;
}
public void setColor(String color) {
this.color = color;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
}
Anm.java
public class Anm {
private List<Person> person; //[]前边的 名字
private Cat cat; //{}前边的名字
private String dog; //键值对中的key
public List<Person> getPerson() {
return person;
}
public void setPerson(List<Person> person) {
this.person = person;
}
public Cat getCat() {
return cat;
}
public void setCat(Cat cat) {
this.cat = cat;
}
public String getDog() {
return dog;
}
public void setDog(String dog) {
this.dog = dog;
}
}
4.Java对象转换成json.只要按要求创建好java对象,就能很快的转换成json了。
/*gson转换java对象为json*/
//创建java对象
Person p1=new Person(); //创建person对象
p1.setName("小周");
p1.setAge(20);
p1.setInfo("这是一个可爱的小宝宝");
Person p2=new Person();
p2.setName("小刘");
p2.setAge(16);
p2.setInfo("这是一个少年");
Cat cat2=new Cat(); //创建cat对象
cat2.setColor("黄色");
cat2.setSex("公猫");
List<Person> list5=new ArrayList<Person>(); //创建person的list
list5.add(p1);
list5.add(p2);
Anm anmm=new Anm(); //创建总对象anm
anmm.setPerson(list5);
anmm.setCat(cat2);
anmm.setDog("这是一只小花狗");
//把anmm转换成json
Gson gs=new Gson();
String js=gs.toJson(anmm);
System.out.println(js);
5.json转换成java对象。
/*gson转换json为java对象*/
//以上一步得到的json js为例来进行转换
String json5=js;
//把json5解析成Anm对象
Gson gson=new Gson();
Anm an=gson.fromJson(json5, Anm.class);
//如果我们需要的是person类的内容
for(int i=0;i<an.getPerson().size();i++){
System.out.println("解析出来的姓名是"+an.getPerson().get(i).getName());
}
注:构造java对象那一步,如果是java对象转json的话,那没什么好说的,按照需要的创建java对象就好,如果是json转java对象,对象的属性可以不用按照json的格式完全写完,写自己需要的就可以,但是如果需要得到里层{}的值,必须把当前那个{}及其外部的所有{}对应的java对象都创建好。
总结:json-lib几乎不依赖java对象,而gson完全依赖java对象,所以我们一般不用到java对象或者需要构造的java对象很简单的时候采用json-lib比较方便,而当json很复杂,得到的数据还需要封装的时候用gson比较省时省力。
最后推荐一个可以在线校验和格式化json的网站http://www.bejson.com/