Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
示例代码:
Gson gson = new Gson();
int[] ints = {1, 2, 3, 4, 5};
String[] strings = {"abc", "def", "ghi"};
(Serialization)
gson.toJson(ints); ==> prints [1,2,3,4,5]
gson.toJson(strings); ==> prints ["abc", "def", "ghi"]
JSON的全称是”JavaScript Object Notation”,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。XML也是一种数据交换格式,为什么没有选择XML呢?因为XML虽然可以作为跨平台的数据交换格式,但是在JS(JavaScript的简写)中处理XML非常不方便,同时XML标记比数据多,增加了交换产生的流量,而JSON没有附加的任何标记,在JS中可作为对象处理,所以我们更倾向于选择JSON来交换数据。
JSON的两种结构
JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。
{
key1:value1,
key2:value2,
...
}
其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码
var obj = {
1: "value1",
"2": "value2",
count: 3,
person: [ //数组结构JSON对象,可以嵌套使用
{
id: 1,
name: "张三"
},
{
id: 2,
name: "李四"
}
],
object: { //对象结构JSON对象
id: 1,
msg: "对象里的对象"
}
};
下面以一个天气的json格式数据
{
"error": 0,
"status": "success",
"date": "2014-05-10",
"results": [
{
"currentCity": "南京",
"weather_data": [
{
"date": "周六(今天, 实时:19℃)",
"dayPictureUrl": "http://api.map.baidu.com/images/weather/day/dayu.png",
"nightPictureUrl": "http://api.map.baidu.com/images/weather/night/dayu.png",
"weather": "大雨",
"wind": "东南风5-6级",
"temperature": "18℃"
},
{
"date": "周日",
"dayPictureUrl": "http://api.map.baidu.com/images/weather/day/zhenyu.png",
"nightPictureUrl": "http://api.map.baidu.com/images/weather/night/duoyun.png",
"weather": "阵雨转多云",
"wind": "西北风4-5级",
"temperature": "21 ~ 14℃"
}
]
}
]
}
现在有好多在线解析json数据的工具,方面我们分析json数据的结构
比如:在线代码格式化
利用在线工具,可以看到json数据的结构,方面我们根据json数据结构来构建解析的实体类
根据json格式定义对应的实体类,方便我们使用gson来封装或者解析json格式数据。(实体类的属性名尽量和json的键名相同,虽然可以通过注解指定名字,但不是很方便
使用 @SerializedName()可以进行修改)
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.usc.bean;
import java.util.List;
public class Status {
private String error;
private String status;
private String date;
private List<Results> results;
public String getError() {
return error;
}
public void setError(String error) {
this.error = error;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public List<Results> getResults() {
return results;
}
public void setResults(List<Results> results) {
this.results = results;
}
@Override
public String toString() {
return "Status [error=" + error + ", status=" + status + ", date="
+ date + ", results=" + results + "]";
}
}
</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.usc.bean;
import java.util.List;
public class Results {
private String currentCity;
private List<Weather> weather_data;
public String getCurrentCity() {
return currentCity;
}
public void setCurrentCity(String currentCity) {
this.currentCity = currentCity;
}
public List<Weather> getWeather_data() {
return weather_data;
}
public void setWeather_data(List<Weather> weather_data) {
this.weather_data = weather_data;
}
@Override
public String toString() {
return "Results [currentCity=" + currentCity + ", weather_data="
+ weather_data + "]";
}
}
</span>
<span style="font-family:KaiTi_GB2312;font-size:18px;">package com.usc.bean;
public class Weather {
private String dayPictureUrl;
private String nightPictureUrl;
private String weather;
private String wind;
private String temperature;
private String date;
public String getDate() {
return date;
}
public void setDate(String date) {
this.date = date;
}
public String getDayPictureUrl() {
return dayPictureUrl;
}
public void setDayPictureUrl(String dayPictureUrl) {
this.dayPictureUrl = dayPictureUrl;
}
public String getNightPictureUrl() {
return nightPictureUrl;
}
public void setNightPictureUrl(String nightPictureUrl) {
this.nightPictureUrl = nightPictureUrl;
}
public String getWeather() {
return weather;
}
public void setWeather(String weather) {
this.weather = weather;
}
public String getWind() {
return wind;
}
public void setWind(String wind) {
this.wind = wind;
}
public String getTemperature() {
return temperature;
}
public void setTemperature(String temperature) {
this.temperature = temperature;
}
@Override
public String toString() {
return "Weather [dayPictureUrl=" + dayPictureUrl + ", nightPictureUrl="
+ nightPictureUrl + ", weather=" + weather + ", wind=" + wind
+ ", temperature=" + temperature + "]";
}
}
</span>
将上面的天气json数据放在weather.txt里面,方便我们通过数据流读取。
使用Gson解析前,需要导入相应的jar包,网上很多
下面开始解析
<span style="font-family:KaiTi_GB2312;font-size:18px;">import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import com.google.gson.Gson;
import com.usc.bean.Results;
import com.usc.bean.Status;
import com.usc.bean.Weather;
public class TestGson {
public static void main(String[] args) throws IOException {
File file=new File("weather.txt");
BufferedReader bf=new BufferedReader(new InputStreamReader(new FileInputStream(file)));
StringBuilder weatherString=new StringBuilder();
String str="";
while((str=bf.readLine())!=null){
weatherString.append(str);
}
//System.out.println(weatherString.toString());
Gson gson=new Gson();
Status status= gson.fromJson(weatherString.toString(), Status.class);
System.out.println(status.getStatus());
System.out.println(status.getDate());
System.out.println(status.getError());
List<Results> results= status.getResults();
//System.out.println(results);
for (int i = 0; i < results.size(); i++) {
Results result= results.get(i);
System.out.println(result.getCurrentCity());
List<Weather> weathers= result.getWeather_data();
for (int j = 0; j < weathers.size(); j++) {
Weather weather= weathers.get(j);
System.out.println(weather.getDate());
System.out.println(weather.getDayPictureUrl());
System.out.println(weather.getNightPictureUrl());
System.out.println(weather.getTemperature());
System.out.println(weather.getWeather());
System.out.println(weather.getWind());
}
}
}
}
</span>
json数组用java的集合来封装,一切面向对象,使用gson解析json方便快捷。
有什么意见请留言,欢迎指教。