@DefinedOne
2015-11-12T09:29:46.000000Z
字数 5604
阅读 1144
json
gson
解析
java
创建于2015/10/27,更新于2015/11/04
Github网址:https://github.com/google/gson
google/gson: A Java serialization library that can convert Java Objects into JSON and back.
(一个能将Java对象和JSON相互转换的Java序列化程序库。)
程序库的下载网址:http://search.maven.org/#artifactdetails|com.google.code.gson|gson|2.4|jar
JSON格式:
{
"id":"25871",
"name":"苹果"
}
需要写这些Java代码解析它:
可以这样写:
public class Food implements Serializable {
private static final long serialVersionUID = 385746866573166810L;
public int id;
public String name;
}
调用Gson类和JsonSyntaxException类,将字符串jsonString解析为Food类的对象。
Food food = null;
try {
food = new Gson().fromJson(jsonString, Food.class);
} catch(JsonSyntaxException e) {
// ... 处理e
}
调用Gson类,将Food对象转换为JSON字符串。
String json = new Gson().toJson(food);
food == null
时得到的json为"null"这个非空字符串。或者这样写:
public class Food implements Serializable {
private static final long serialVersionUID = 878065946505174667L;
public String id;
public String name;
}
或者这样写:
public class Food implements Serializable {
private static final long serialVersionUID = -2440906703930967942L;
private int id;
private String name;
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;
}
}
Serializable接口
和生成的serialVersionUID
常量。实际中需要加上。JSON格式:
{
"id":"25871",
"name":"苹果",
"taste":{ // 味道的评价
"sour":"3", // 酸味
"sweet":"8", // 甜味
"peppery":"0" // 辣味
}
}
需要写这些Java代码解析它:
可以这样写:
*Food.java*
public class Food {
public String id;
public String name;
public TasteEvaluation taste;
public static class TasteEvaluation { // 味道的评价
public int sour; // 酸味
public int sweet; // 甜味
public int peppery; // 辣味
}
}
自由定义
的;或者这样写:
*Food.java文件*
public class Food {
public String id;
public String name;
public TasteEvaluation taste;
}
*TasteEvaluation.java文件*
public class TasteEvaluation { // 味道的评价
public int sour; // 酸味
public int sweet; // 甜味
public int peppery; // 辣味
}
JSON格式:
{
"type":"fruit", // 食物类型为水果
"content":[
{"id":"25871","name":"苹果"},
{"id":"4646","name":"梨"},
{"id":"1657","name":"香蕉"},
{"id":"6874","name":"西瓜"}
]
}
需要写这些Java代码解析它:
import java.util.List;
public class FoodDictionary {
public String type;
public List<Food> content;
}
Gson是否能解析继承了某个类的JavaBean类?
*Response.java*
public class Response {
public int code;
public int message;
}
*ResponseFoodDictionary.java*
public class ResponseFoodDictionary extends Response {
public FoodDictionary foodDictionary; // 继承之后添加了这个字段
}
在2.2节中的JSON数据的格式:
{
"id":"25871",
"name":"苹果",
"taste":{ // 味道的评价
"sour":"3", // 酸味
"sweet":"8", // 甜味
"peppery":"0" // 辣味
}
}
相对2.1节的,多了taste
这个字段。
2.1节的Food
类:
public class Food {
public int id;
public String name;
}
这个Food
类中没有taste
这个变量,但是用它解析这个JSON时,程序能够正常运行。但是,显然,这样就不能将taste
字段的数据保存在Food
类中。
在2.1节中的JSON数据的格式:
{
"id":"25871",
"name":"苹果",
}
2.2节的Food
类:
public class Food {
public String id;
public String name;
public TasteEvaluation taste;
}
这个Food
类比较这个JSON多余了taste
变量,但是用它解析这个JSON时,程序能够正常运行。但是,显然,这样就没有给taste
变量赋值,于是taste
变量的值为初始值
,即null
。
Gson能否处理带有泛型参数的JavaBean类型?
例如,Response
类型具有一个泛型参数T:
public class Response<T> implements Serializable {
private static final long serialVersionUID = -8476732816742376064L;
public T data;
}
能够解析不论T为那种JavaBean类型,Gson都能解析。
例如,Json数据:
{"data":{"id":"25871","name":"苹果"}}
需要写这些Java代码解析它:
Response<Food> response = new Gson().fromJson(json, new TypeToken<Response<Food>>() {}.getType());
这里为什么不使用Response<Food>.class
,而使用new TypeToken<Response<Food>>() {}.getType()
呢?请继续阅读。
T.class
, Response<Food>.class
等语句,编译会出现错误。【 待完善 】
package com.gis.pror.networkconnection;
import com.android.volley.AuthFailureError;
import com.android.volley.NetworkResponse;
import com.android.volley.ParseError;
import com.android.volley.Request;
import com.android.volley.Response;
import com.android.volley.Response.ErrorListener;
import com.android.volley.toolbox.HttpHeaderParser;
import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import java.io.UnsupportedEncodingException;
import java.util.Map;
/**
*
* @author 翻译者:王永阁,更新者:dengnengcai
*
* @date 2015/11/12.
*
* 信息来自:
* http://blog.csdn.net/wangyongge85/article/details/48522233
*/
public class GsonRequest<T> extends Request<T> {
private final Class<T> mClazz;
private final Response.Listener<T> mListener;
private final Map<String, String> mHeaders;
private final Gson mGson = new Gson();
/**
* GET请求方式,并且返回JSON解析对象
*/
public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener, ErrorListener errorListener) {
this(url, clazz, listener, errorListener, null);
}
/**
* GET请求方式,并且返回JSON解析对象
*/
public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,
ErrorListener errorListener, Map<String, String> headers) {
super(Method.GET, url, errorListener);
this.mClazz = clazz;
this.mHeaders = headers;
this.mListener = listener;
}
/**
* 方法回调
*/
@Override
protected void deliverResponse(T response) {
mListener.onResponse(response);
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
return Response.success(mGson.fromJson(json, mClazz), HttpHeaderParser.parseCacheHeaders(
response));
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
@Override
public Map<String, String> getHeaders() throws AuthFailureError {
return mHeaders != null ? mHeaders : super.getHeaders();
}
}
信息来自:
http://blog.csdn.net/wangyongge85/article/details/48522233
copy https://zybuluo.com/DefinedOne/note/204558
* end *