gson使用教程-翻译1
来源:互联网 发布:移动公司网络维护员 编辑:程序博客网 时间:2024/04/30 04:53
原文地址:http://www.studytrails.com/java/json/java-google-json-parse-json-to-java.jsp
1.json与java对象之间的互转——Data Binding方式
gson提供两种方式去将json解析成java对象.在这个教程中,我们将暂时不考虑泛型. 以下:
- 使用Gson类,使用这个类的public T fromJson(String json,Class classOfT)方法,classOfT就是你要解析成的Java对象的Class对象.
- 另一种方法就是使用GsonBuilder类,这个类允许设置某些特征,例如可以设置解析null和自定义解析策略.使用这个类的时候,在设置完自定义的特征之后,在通过build方法就可以获取到Gson对象.
在这个教程中,我们将会以free music archive为例.
你会看到这个json如下:
{title: "Free Music Archive - Albums",message: "",errors: [ ],total: "11259",total_pages: 2252,page: 1,limit: "5",dataset: [{......
首先,我们忽略掉dataset.我们为根节点创建java类,叫Albums.为了看起来更加简洁,我们使用public的属性.你也可以使用private的属性和添加getter和setter.如下:
class Albums { public String title; public String message; public String[] errors = new String[]{}; public String total; public int total_pages; public int page; public String limit;}
接下来,我们把这个类解析成一个json,看
import com.google.gson.Gson;public class JavaToJsonAndBack { public static void main(String[] args) { Albums albums = new Albums(); albums.title = "Free Music Archive - Albums"; albums.message = ""; albums.total = "11259"; albums.total_pages = 2252; albums.page = 1; albums.limit = "5"; GsonBuilder builder = new GsonBuilder(); Gson gson = builder.create(); System.out.println(gson.toJson(albums)); }}
打印出来的结果:
{"title":"Free Music Archive - Albums","message":"","errors":[],"total":"11259","total_pages":2252,"page":1,"limit":"5"}
注意一下,我们初始化了errors这个数组,才让它呈现空的状态,如果我们不初始化errors数据,gson将会忽略这个字段.在这种情况下只有我们设置允许Null解析时,才会打印出null.所以,我们将使用一个List集合来代替: public List<String> errors = new ArrayList<String>();
下一步就是构建dataset的类,dataset的json,看:
dataset: [{album_id: "7596",album_title: "!!! - Live @ KEXP 7/24/2010",......album_images: [{image_id: "10574",user_id: null,.....}],tags: [ ]
在这个教程中,我们仅仅考虑”dataset”的基本类型属性和”album_images”两者,剩余的不予考虑.两者的java类,看:
class Dataset { public String album_id; public String album_title;}class AlbumImages { public String image_id; public String user_id;}
将DataSet解析成json,看:
Dataset dataset = new Dataset();dataset.album_id = "7596";dataset.album_title = "Album 1";System.out.println(gson.toJson(dataset));
打印的结果:
{"album_id":"7596","album_title":"Album 1"}
将AlbumImages解析成json,看:
AlbumImages image = new AlbumImages();image.image_id = "1";System.out.println(gson.toJson(image));
打印结果:
{"image_id":"1"}
从打印结果来看,没有赋值的user_id是没有打印出来的,这里我们可以使用GsonBuilder来设置Null解析,看:
builder.serializeNulls();
设置Null解析之后,打印结果:
{"image_id":"1","user_id":null}
接下来我们把上面建好的类联系起来,将AlbumImage添加到DataSet里.
List<AlbumImages> images = new ArrayList<AlbumImages>();
然后把DataSet添加到Albums中
List<Dataset> dataset = new ArrayList<Dataset>();
然后在代码中关联起来:
dataset.images.add(image);albums.dataset.add(dataset);
打印结果:
{"title":"Free Music Archive - Albums","message":"","errors":[],"total":"11259","total_pages":2252,"page":1,"limit":"5","dataset":[{"album_id":"7596","album_title":"Album 1","images":[{"image_id":"1","user_id":null}]}]}
这样的结果看起来好不爽,我们通过设置让打印结果更清晰(通常在测试中使用,生成环境最好使用默认的设置)
builder.setPrettyPrinting().serializeNulls();
设置之后的结果:
{ "title": "Free Music Archive - Albums", "message": "", "errors": [], "total": "11259", "total_pages": 2252, "page": 1, "limit": "5", "dataset": [ { "album_id": "7596", "album_title": "Album 1", "images": [ { "image_id": "1", "user_id": null } ] } ]}
现在好多了,继续,如果我们想要在json中”images”显示为”album_images”.同时我们又不可以把类中的字段名修改,这时我们可以通过使用SerializedName注解来为这个字段指定一个别名,看:
@SerializedName("album_images")List<AlbumImages> images = new ArrayList<AlbumImages>();
打印结果就看到”images”变为”album_images”了:
"dataset": [ { "album_id": "7596", "album_title": "Album 1", "album_images": [ { "image_id": "1", .........
如果你是想在某一次的解析用到这个别名,我们可以通过代码的方式来设置别名,我们先为AlbumImage添加一个albumId的属性,同时我们想在json看到的属性为”album_id”,代码如下,看:
builder.setFieldNamingStrategy(new FieldNamingStrategy() { @Override public String translateName(Field f) { if (f.getName().equals("albumId")) return "album_id"; else return f.getName(); } });
translateName这个方法会在解析过程中解析到每一个属性的时候都会被调用,我们在这个方法里面通过匹配属性名为albumId的属性,给这个属性返回一个名为的”album_id”的别名.打印结果:
"album_images": [ { "image_id": "1", "user_id": null, "album_id": "10" }
GsonBuilder提供了很多的自定义的解析选项.你可以关闭Html转义,排除一些字段(例如:排除所有的protected修饰的字段),设置自定义类型的转换器,设置排除策略等,详情可以查看官方的文档.
好了,到这里我们已经将目标的类构建出来了(漏掉的字段需要补充完整),我们可以通过Gson的fromJson方法将开始的json解析成Albums对象.看:
// url is the free music archive url.Albums albums = gson.fromJson(IOUtils.toString(new URL(url)), Albums.class);
总结:
1.json转Java,通过toJson()方法
2.Java转json,通过fromJson()方法
3.通过builder.serializeNulls()方法来设置Null解析
4.通过builder.setPrettyPrinting()方法来设置打印格式
5.通过@SerializedName注解或者builder.setFieldNamingStrategy()为属性设置解析别名(注意两者的区别).
- gson使用教程-翻译1
- gson使用教程-翻译2
- gson使用教程-翻译3
- gson使用教程-翻译4
- gson使用教程-翻译5
- gson使用教程-翻译6
- gson使用教程-翻译7
- gson使用教程-翻译8
- Gson使用教程
- GSON 使用教程
- Gson使用简单教程
- FastJson Jackson Gson使用教程
- Gson源码学习笔记(1)——Gson使用教程(译)
- Gson 教程
- 详解Gson使用(五)实现百度翻译功能
- 【Gson】Gson 使用笔记
- Gson的使用(1)
- Gson教程十一(译):轻松使用仁慈的Gson(容错机制)
- 黑马程序员--Java基础学习(IO流及字符编码)第二十一天
- Pascal数组
- UMeditor百度富文本编辑器的使用
- MySQL外键约束On Delete和On Update的使用
- android 内核编译问题汇总
- gson使用教程-翻译1
- mui适用场景说明,能不能在普通浏览器里使用,能否用于wap网站
- Unity优化大全(一)之开篇前言
- 天天酷跑
- android PorterDuffXfermode ,PorterDuff.Mode 使用 以及Porter-Duff规则详解
- 第5周工作周报
- 出入栈顺序可能性
- Hdu 2035 人见人爱A^B【快速幂】
- 虚函数、抽象类、接口类