json和java对象的相互转换(json-lib和Gson的使用)

java开发中时常会遇到jsonjava对象转换的情况,比如说一般接口调用返回的都是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. 解析jsonjava对象。

 

/*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就的的确确是jsonjava对象之间的转换了,它省去了先解析再封装的过程,只需要一步,就能够实现jsonjava对象的转换。

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,也要和对应的{}前边的名字或对应[]前边的名字一样。总类的属性是由personlistcat对象和键值对的属性构成。最后的创建结果是:

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对象就好,如果是jsonjava对象,对象的属性可以不用按照json的格式完全写完,写自己需要的就可以,但是如果需要得到里层{}的值,必须把当前那个{}及其外部的所有{}对应的java对象都创建好。

 

总结:json-lib几乎不依赖java对象,而gson完全依赖java对象,所以我们一般不用到java对象或者需要构造的java对象很简单的时候采用json-lib比较方便,而当json很复杂,得到的数据还需要封装的时候用gson比较省时省力。

 

最后推荐一个可以在线校验和格式化json的网站http://www.bejson.com/

 

 


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值