到官网下载完之后解压缩
要的只有一个gson-2.2.4.jar 我用的是2.2.4 大小是186kb
最重要的类是Gson
假设有如下的几个javabean
public class Person {
private int id;
private String name;
private List<String> items;
private Shabi shabi;
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", items=" + items + ", age=" + age + "]";
}
public List<String> getItems() {
return items;
}
public void setItems(List<String> items) {
this.items = items;
}
public int getId222() {
return id;
}
public void setId222(int id) {
this.id = id;
}
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;
}
private int age;
public Shabi getShabi() {
return shabi;
}
public void setShabi(Shabi shabi) {
this.shabi = shabi;
}
}
public class Shabi {
private int id;
private String name;
private String ceshi;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCeshi() {
return ceshi;
}
public void setCeshi(String ceshi) {
this.ceshi = ceshi;
}
}
1从对象到json字符串
Gson g=new Gson();//采用默认方式构造一个Gson 如果有需要还可以利用GsonBuilder定制一个Gson
Person p = new Person();
p.setId222( 1 );
p.setName( "xzc" );
p.setAge( 20 );
p.setItems( Arrays.asList( "1", "22", "333", "4444" ) );
Shabi sb = new Shabi();
sb.setId( 2 );
sb.setName( "sb2" );
sb.setCeshi( "ceshi```123" );
p.setShabi( sb );
//上面几步用于把对象的关系设置好
String js = g.toJson( p );
System.out.println( js );// 构造后的表达式
//会输出{"id":1,"name":"xzc","items":["1","22","333","4444"],"shabi":{"id":2,"name":"sb2","ceshi":"ceshi```123"},"age":20}
2从json字符串到对象
Gson g = new Gson();
Person p = new Person();
p.setId( 1 );
p.setName( "xzc" );
p.setAge( 20 );
p.setItems( Arrays.asList( "1", "22", "333", "4444" ) );
Shabi sb = new Shabi();
sb.setId( 2 );
sb.setName( "sb2" );
sb.setCeshi( "ceshi```123" );
p.setShabi( sb );
String js = g.toJson( p );
//上面几步用于生成一个json字符串js
p = g.fromJson( js, Person.class );//如果js中没有指定某些属性(比如少了id),那么那些属性就不会被设置值(id默认就为0)
//根据字符串js,和类Person 创建出对象p
System.out.println( p.toString() );
System.out.println( p.getShabi().getName() );
3 上面都是以javabean对象为模型,构造的字符串
也可以使用JsonElement及其子类,手动构造
JsonElement下分有:
NULL 基本数据类型 对象 数组
3.1 NULL用于标记是否为null而已(当然还有一些关于null的细节,具体看api文档)
3.2 JsonPrimitive表示了一些基本数据类型
看一下即可
3.3 对象,一个对象有多个属性
每个属性是一个JsonElement
3.4 数组 可以放多个JsonElement 可以同时有字符串和数字
记住如果使用JsonElement.getAdXXX之类的方法
如果失败了就会抛出异常
即使对应的值是null也会抛出异常
几个例子
JsonObject jo = new JsonObject();//创建一个obj
jo.addProperty( "name", "xzc" );//添加一个属性 name=xzc
System.out.println( jo.get( "name" ).getAsString() );//打印出来一下 确认
jo.addProperty( "name", "xzc2" );//再添加 name 就会盖掉原先的name
System.out.println( jo.get( "name" ).getAsString() );//打出xzc2
jo.add( "name", JsonNull.INSTANCE );//添加name=NULL 效果相当于是删除这个属性(不过总感觉有细微差别,这样还是存在一个属性name,只不过值是NULL?)
//System.out.println( jo.get( "name" ).getAsString() );//这句话会抛异常 因为对应的内容是NULL 不能转成字符串的null
数组 add的参数是一个JsonElement
JsonArray ja=new JsonArray();
ja.add( new JsonPrimitive( "123" ) );
ja.add( new JsonPrimitive( 7758 ) );
System.out.println(ja.toString());
JsonReader和JsonWriter
详情请看Gson的api文档
一个例子
StringWriter sw=new StringWriter();
JsonWriter jw=new JsonWriter( sw );
jw.beginArray();
jw.beginObject();
jw.name("name").value( "xzc");
jw.name("age" ).value( 20 );
jw.endObject();
jw.endArray();
jw.close();
sw.close();
System.out.println(sw.toString());
json最外层肯定是一个Object或Array
所以肯定要beginArray或beginObject
Gson根据对象产生json字符串,根据的是字段,而不是get,set方法
如果不想某个字段用于生成json字符串
需要这样做
@Expose(serialize=false,deserialize=false)
private int id;
如果需要修改某个字段在json字符串中的名称可以这样做
@SerializedName("xoo5")
private int id;//那么生成的就是"xoo5":10 而不是 "id":10 了
最后还有@Since(1.2) @Until(1.5)
给一个字段打上
@Since(1.2)表示这个字段是1.2版本才加进来的
@Until(1.5)表示这个字段1.5之后不再使用
当你构造Gson的时候使用 Gson g=new GsonBuilder().setVersion(1.1).create();的时候
的时候 被上面两个标记打上的字段都不会参与 序列化和反序列化
版本为1.3的时候 被上面两个标记打上的字段都会参与...
版本为1.7的时候 只有@Since(1.2)的 会参与