@DefinedOne
2015-11-12T09:29:46.000000Z
字数 5604
阅读 1227
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;}/*** 方法回调*/@Overrideprotected void deliverResponse(T response) {mListener.onResponse(response);}@Overrideprotected 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));}}@Overridepublic 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 *