[关闭]
@DefinedOne 2015-11-12T09:29:46.000000Z 字数 5604 阅读 1145

使用Gson解析JSON数据

json gson 解析 java

创建于2015/10/27,更新于2015/11/04



1. Google的开源项目--Gson

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

2. 最常见的使用方法

2.1 例子一,多种使用方法

JSON格式:

  1. {
  2. "id":"25871",
  3. "name":"苹果"
  4. }

需要写这些Java代码解析它:
可以这样写:

  1. public class Food implements Serializable {
  2. private static final long serialVersionUID = 385746866573166810L;
  3. public int id;
  4. public String name;
  5. }

调用Gson类和JsonSyntaxException类,将字符串jsonString解析为Food类的对象。

  1. Food food = null;
  2. try {
  3. food = new Gson().fromJson(jsonString, Food.class);
  4. } catch(JsonSyntaxException e) {
  5. // ... 处理e
  6. }

调用Gson类,将Food对象转换为JSON字符串。

  1. String json = new Gson().toJson(food);

或者这样写:

  1. public class Food implements Serializable {
  2. private static final long serialVersionUID = 878065946505174667L;
  3. public String id;
  4. public String name;
  5. }

或者这样写:

  1. public class Food implements Serializable {
  2. private static final long serialVersionUID = -2440906703930967942L;
  3. private int id;
  4. private String name;
  5. public int getId() {
  6. return id;
  7. }
  8. public void setId(int id) {
  9. this.id = id;
  10. }
  11. public String getName() {
  12. return name;
  13. }
  14. public void setName(String name) {
  15. this.name = name;
  16. }
  17. }

2.2 例子二,解析嵌套类

JSON格式:

  1. {
  2. "id":"25871",
  3. "name":"苹果",
  4. "taste":{ // 味道的评价
  5. "sour":"3", // 酸味
  6. "sweet":"8", // 甜味
  7. "peppery":"0" // 辣味
  8. }
  9. }

需要写这些Java代码解析它:
可以这样写:

  1. *Food.java*
  2. public class Food {
  3. public String id;
  4. public String name;
  5. public TasteEvaluation taste;
  6. public static class TasteEvaluation { // 味道的评价
  7. public int sour; // 酸味
  8. public int sweet; // 甜味
  9. public int peppery; // 辣味
  10. }
  11. }

或者这样写:

  1. *Food.java文件*
  2. public class Food {
  3. public String id;
  4. public String name;
  5. public TasteEvaluation taste;
  6. }
  1. *TasteEvaluation.java文件*
  2. public class TasteEvaluation { // 味道的评价
  3. public int sour; // 酸味
  4. public int sweet; // 甜味
  5. public int peppery; // 辣味
  6. }

2.3 例子三--解析数组

JSON格式:

  1. {
  2. "type":"fruit", // 食物类型为水果
  3. "content":[
  4. {"id":"25871","name":"苹果"},
  5. {"id":"4646","name":"梨"},
  6. {"id":"1657","name":"香蕉"},
  7. {"id":"6874","name":"西瓜"}
  8. ]
  9. }

需要写这些Java代码解析它:

  1. import java.util.List;
  2. public class FoodDictionary {
  3. public String type;
  4. public List<Food> content;
  5. }

2.4 解析继承的子类

Gson是否能解析继承了某个类的JavaBean类?

  1. *Response.java*
  2. public class Response {
  3. public int code;
  4. public int message;
  5. }
  1. *ResponseFoodDictionary.java*
  2. public class ResponseFoodDictionary extends Response {
  3. public FoodDictionary foodDictionary; // 继承之后添加了这个字段
  4. }

2.5 缺少字段的JavaBean

在2.2节中的JSON数据的格式:

  1. {
  2. "id":"25871",
  3. "name":"苹果",
  4. "taste":{ // 味道的评价
  5. "sour":"3", // 酸味
  6. "sweet":"8", // 甜味
  7. "peppery":"0" // 辣味
  8. }
  9. }

相对2.1节的,多了taste这个字段。
2.1节的Food类:

  1. public class Food {
  2. public int id;
  3. public String name;
  4. }

这个Food类中没有taste这个变量,但是用它解析这个JSON时,程序能够正常运行。但是,显然,这样就不能将taste字段的数据保存在Food类中。

2.6 多余字段的JavaBean

在2.1节中的JSON数据的格式:

  1. {
  2. "id":"25871",
  3. "name":"苹果",
  4. }

2.2节的Food类:

  1. public class Food {
  2. public String id;
  3. public String name;
  4. public TasteEvaluation taste;
  5. }

这个Food类比较这个JSON多余了taste变量,但是用它解析这个JSON时,程序能够正常运行。但是,显然,这样就没有给taste变量赋值,于是taste变量的值为初始值,即null

2.7 带有泛型参数的JavaBean类

Gson能否处理带有泛型参数的JavaBean类型?
例如,Response类型具有一个泛型参数T:

  1. public class Response<T> implements Serializable {
  2. private static final long serialVersionUID = -8476732816742376064L;
  3. public T data;
  4. }

能够解析不论T为那种JavaBean类型,Gson都能解析。
例如,Json数据:

  1. {"data":{"id":"25871","name":"苹果"}}

需要写这些Java代码解析它:

  1. Response<Food> response = new Gson().fromJson(json, new TypeToken<Response<Food>>() {}.getType());

这里为什么不使用Response<Food>.class,而使用new TypeToken<Response<Food>>() {}.getType()呢?请继续阅读。

2.8 使用Gson和Volley框架封装网络请求的工具

【 待完善 】

  1. package com.gis.pror.networkconnection;
  2. import com.android.volley.AuthFailureError;
  3. import com.android.volley.NetworkResponse;
  4. import com.android.volley.ParseError;
  5. import com.android.volley.Request;
  6. import com.android.volley.Response;
  7. import com.android.volley.Response.ErrorListener;
  8. import com.android.volley.toolbox.HttpHeaderParser;
  9. import com.google.gson.Gson;
  10. import com.google.gson.JsonSyntaxException;
  11. import java.io.UnsupportedEncodingException;
  12. import java.util.Map;
  13. /**
  14. *
  15. * @author 翻译者:王永阁,更新者:dengnengcai
  16. *
  17. * @date 2015/11/12.
  18. *
  19. * 信息来自:
  20. * http://blog.csdn.net/wangyongge85/article/details/48522233
  21. */
  22. public class GsonRequest<T> extends Request<T> {
  23. private final Class<T> mClazz;
  24. private final Response.Listener<T> mListener;
  25. private final Map<String, String> mHeaders;
  26. private final Gson mGson = new Gson();
  27. /**
  28. * GET请求方式,并且返回JSON解析对象
  29. */
  30. public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener, ErrorListener errorListener) {
  31. this(url, clazz, listener, errorListener, null);
  32. }
  33. /**
  34. * GET请求方式,并且返回JSON解析对象
  35. */
  36. public GsonRequest(String url, Class<T> clazz, Response.Listener<T> listener,
  37. ErrorListener errorListener, Map<String, String> headers) {
  38. super(Method.GET, url, errorListener);
  39. this.mClazz = clazz;
  40. this.mHeaders = headers;
  41. this.mListener = listener;
  42. }
  43. /**
  44. * 方法回调
  45. */
  46. @Override
  47. protected void deliverResponse(T response) {
  48. mListener.onResponse(response);
  49. }
  50. @Override
  51. protected Response<T> parseNetworkResponse(NetworkResponse response) {
  52. try {
  53. String json = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
  54. return Response.success(mGson.fromJson(json, mClazz), HttpHeaderParser.parseCacheHeaders(
  55. response));
  56. } catch (UnsupportedEncodingException e) {
  57. return Response.error(new ParseError(e));
  58. } catch (JsonSyntaxException e) {
  59. return Response.error(new ParseError(e));
  60. }
  61. }
  62. @Override
  63. public Map<String, String> getHeaders() throws AuthFailureError {
  64. return mHeaders != null ? mHeaders : super.getHeaders();
  65. }
  66. }

信息来自:
http://blog.csdn.net/wangyongge85/article/details/48522233

4 Gson不能解析的

4.1 没有继承Serializable接口的JavaBean类

?具体细节待测试。

copy https://zybuluo.com/DefinedOne/note/204558

* end *


添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注