Java_Gson json的学习
2016-08-16 15:27
417 查看
转载请注明出处:http://blog.csdn.net/y22222ly/article/details/52213043
首先需要写一个Object类,作为这个json的实体类。这里我使用的IDE为Android Studio,使用GsonFormat插件能一键转换为Object对象。自己写的时候,顺着符号
转换后的对象如下
Weather.java
准备工作已做好,下面看Gson如何解析:
Persion对象如下:
比如:
若需要显示 null 对象:
默认日期格式:
使用GsonBuilder格式化后的日志格式:
但是我们移动端根本不需要这么详细的定义,还是想像之前一样使用name来表示姓名,那可不可以呢,当然可以,使用注解
当然,从后端下发下来的json不带
很明显,我们应该在生成json时,想办法踢掉这个
使用了新的注解后,记得在GsonBuilder时增加excludeFieldsWithoutExposeAnnotation()方法,转换的json就不带
Person
参考资料:
http://www.studytrails.com/java/json/java-google-json-parse-json-to-java.jsp
http://blog.csdn.net/lk_blog/article/details/7685169
Gson基本使用
下面对json做json->object;object->json操作:{ "code": 200, "msg": "success", "newslist": [ { "ctime": "2016-03-31", "title": "奇虎360宣布通过私有化决议", "description": "互联网头条", "picUrl": "http://t1.qpic.cn/mblogpic/f01a972dbcc1060fd456/2000", "url": "http://mp.weixin.qq.com/s?__biz=MjM5OTMyODA2MA==&idx=1&mid=402594468&sn=5cd644536b472a283cc1d3f5124a0cab" }, { "ctime": "2016-03-31", "title": "小本生意做什么挣钱十七大小本生意推荐", "description": "创业最前线", "picUrl": "http://zxpic.gtimg.com/infonew/0/wechat_pics_-4225297.jpg/640", "url": "http://mp.weixin.qq.com/s?__biz=MzA3NjgzNDUwMQ==&idx=2&mid=401864059&sn=cfa082e38ba38c7e673b1ce0a075faee" } ] }
首先需要写一个Object类,作为这个json的实体类。这里我使用的IDE为Android Studio,使用GsonFormat插件能一键转换为Object对象。自己写的时候,顺着符号
{``[来写即可,遇到
{表示该字段为对象,遇到
[表明该字段为数组或是集合。
转换后的对象如下
Weather.java
package com.raise.raisestudy.gson.entity; import java.util.List; /** * Created by raise.yang on 16/08/15. */ public class NewsInfo { /** * code : 200 * msg : success * newslist : [{"ctime":"2016-03-31","title":"奇虎360宣布通过私有化决议","description":"互联网头条","picUrl":"http://t1.qpic.cn/mblogpic/f01a972dbcc1060fd456/2000","url":"http://mp.weixin.qq.com/s?__biz=MjM5OTMyODA2MA==&idx=1&mid=402594468&sn=5cd644536b472a283cc1d3f5124a0cab"},{"ctime":"2016-03-31","title":"小本生意做什么挣钱十七大小本生意推荐","description":"创业最前线","picUrl":"http://zxpic.gtimg.com/infonew/0/wechat_pics_-4225297.jpg/640","url":"http://mp.weixin.qq.com/s?__biz=MzA3NjgzNDUwMQ==&idx=2&mid=401864059&sn=cfa082e38ba38c7e673b1ce0a075faee"}] */ private int code; private String msg; /** * ctime : 2016-03-31 * title : 奇虎360宣布通过私有化决议 * description : 互联网头条 * picUrl : http://t1.qpic.cn/mblogpic/f01a972dbcc1060fd456/2000 * url : http://mp.weixin.qq.com/s?__biz=MjM5OTMyODA2MA==&idx=1&mid=402594468&sn=5cd644536b472a283cc1d3f5124a0cab */ private List<NewslistBean> newslist; public int getCode() { return code; } public void setCode(int code) { this.code = code; } public String getMsg() { return msg; } public void setMsg(String msg) { this.msg = msg; } public List<NewslistBean> getNewslist() { return newslist; } public void setNewslist(List<NewslistBean> newslist) { this.newslist = newslist; } public static class NewslistBean { private String ctime; private String title; private String description; private String picUrl; private String url; public String getCtime() { return ctime; } public void setCtime(String ctime) { this.ctime = ctime; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } public String getPicUrl() { return picUrl; } public void setPicUrl(String picUrl) { this.picUrl = picUrl; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } } }
准备工作已做好,下面看Gson如何解析:
json,object互转
String json = ...; Gson gson = new Gson(); //json -> object NewsInfo newsInfo = gson.fromJson(json, NewsInfo.class); //object ->json gson.toJson(newsInfo);
数组的处理
Gson gson = new Gson(); int[] ints = {1, 2, 3, 4, 5}; String[] strings = {"abc", "def", "ghi"}; // Serialization gson.toJson(ints); // ==> [1,2,3,4,5] gson.toJson(strings); // ==> ["abc", "def", "ghi"] // Deserialization int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); // ==> ints2 will be same as ints
泛型的处理
泛型的解析,需要通过Gson提供的TypeToken类,获取一个Type.class Foo<T> { T value; } Gson gson = new Gson(); Foo<Bar> foo = new Foo<Bar>(); Type fooType = new TypeToken<Foo<Bar>>() {}.getType(); gson.toJson(foo,fooType); gson.fromJson(json, fooType);
null对象的处理
当一个对象的某个属性值为null时,Gson在生成json时会忽略掉这个属性。Persion对象如下:
public class Person { public double height; public String name; public int age; public Person(double height, String name, int age) { this.height = height; this.name = name; this.age = age; } //...get(),set() }
比如:
Gson gson = new Gson(); Person person = new Person(1.72,null,10); Log.d(TAG,gson.toJson(person));// -->{"age":10,"height":1.72}
GsonBuilder
Gson对象有一个很强大的工厂类GsonBuilder,它可以在创建一个特定的Gson对象,用来制定转换规则。若需要显示 null 对象:
Gson gson = new GsonBuilder().serializeNulls().create(); Person person = new Person(1.72,null,10); Log.d(TAG,gson.toJson(person));// -->{"age":10,"height":1.72,"name":null}
日期的处理
在Person类增加了下例字段:public Date birthday;
默认日期格式:
Gson gson = new GsonBuilder().serializeNulls().create(); Person person = new Person(1.72,null,10,new Date()); Log.d(TAG,gson.toJson(person));// -->{"age":10,"birthday":"Aug 15, 2016 19:42:52","height":1.72,"name":null}
使用GsonBuilder格式化后的日志格式:
Gson gson = new GsonBuilder(). serializeNulls() .setDateFormat("yyyyMMdd") .create(); Person person = new Person(1.72,null,10,new Date()); Log.d(TAG,gson.toJson(person));// -->{"age":10,"birthday":"20160815","height":1.72,"name":null}
修改映射key名称
后端人员有时下发json也不安套路出牌,若后端下发给我们的是以下json:{"age":10,"birthday":"20160815","height":1.72,"person_name":null}
但是我们移动端根本不需要这么详细的定义,还是想像之前一样使用name来表示姓名,那可不可以呢,当然可以,使用注解
@SerializedName即可,这样Person修改为:
public double height; @SerializedName("person_name") public String name; public int age; public Date birthday;
@SerializedName可以指定转换时,字段的key。
Gson gson = new GsonBuilder(). serializeNulls() .setDateFormat("yyyyMMdd") .create(); String person_json = "{\"age\":10,\"birthday\":\"20160815\",\"height\":1.72,\"person_name\":null}"; Person person = gson.fromJson(person_json, Person.class); Log.d(TAG,person.toString());// -->Person{height=1.72, name='null', age=10, birthday=20160815}
忽略某些字段
当我们收到Person信息时,为了持久化数据,应该保存在数据库中,因此会增加一个id字段,Person字段修改如下:public double _id;//新增 public double height; @SerializedName("person_name") public String name; public int age; public Date birthday;
当然,从后端下发下来的json不带
_id字段也可以直接使用gson.fromJson()自动转换为Person对象,但是当我们将Person转换为json上传到后端时,如果不做处理,会自动的增加
_id这个字段,如下:
Gson gson = new GsonBuilder(). serializeNulls() .setDateFormat("yyyyMMdd") .create(); Person person = new Person(1,1.70,"raise",10, new Date()); Log.d(TAG,gson.toJson(person));// -->{"_id":1.0,"age":10,"birthday":"20160816","height":1.7,"person_name":"raise"}
很明显,我们应该在生成json时,想办法踢掉这个
_id字段,这是Gson提供了新的注解
@Expose,用来显示哪些字段需要转换。
使用了新的注解后,记得在GsonBuilder时增加excludeFieldsWithoutExposeAnnotation()方法,转换的json就不带
_id字段:
Person
public double _id; @Expose //需要显示转换的字段 public double height; @Expose @SerializedName("person_name") public String name; @Expose public int age; @Expose public Date birthday;
Gson gson = new GsonBuilder() .serializeNulls() .excludeFieldsWithoutExposeAnnotation()//只转换带@Expose注解的字段 .setDateFormat("yyyyMMdd") .create(); Person person = new Person(1,1.70,"raise",10, new Date()); Log.d(TAG,gson.toJson(person));// -->{"age":10,"birthday":"20160816","height":1.7,"person_name":"raise"}
参考资料:
http://www.studytrails.com/java/json/java-google-json-parse-json-to-java.jsp
http://blog.csdn.net/lk_blog/article/details/7685169
相关文章推荐
- Json与Java对象互转之Gson学习
- JSON详细学习之Gson in JAVA
- Json与Java对象互转之Gson学习
- JSON详细学习之Gson in JAVA
- Java学习总结(二十)——JSON解析:官方解析,GSON解析,FastJSON解析,
- Java--学习(一)关于使用Gson将json字符串转换成对象
- JSON-RPC-Java学习之JSON-RPCspecificationsWeb服务器教程
- google-gson - A Java library to convert JSON to Java objects and vice-versa
- Java操作JSON的便捷工具类(Gson)
- 使用Gson将Java对象转换为Json
- Java 学习笔记12:Java Json对象转换
- json学习(java篇)
- Java的JSON类库 Gson
- json学习(java,js)
- Gson--Java对象生成Json串
- 使用Gson将Java对象转换为Json
- Java下json的解析方法-----GSON与JSONObject
- JSON详细学习之JSONObject in JAVA
- JAVA处理JSON学习
- JSON详细学习之JSONObject in JAVA