客户端跟服务器交互的时候我们使用json实现 但是 在交互的时候除了传送json对象数据意外 我们还需要传输标志位等

比如我们现在的交互方式格式

对象
  1. {
  2. "data": {
  3. "age": 29,
  4. "name": "wangzhiqiang",
  5. "sex": 1
  6. },
  7. "message": "ok",
  8. "status": 200
  9. }
列表
  1. {
  2. "data": [
  3. {
  4. "age": 29,
  5. "name": "wangzhiqiang",
  6. "sex": 1
  7. },
  8. {
  9. "age": 29,
  10. "name": "wangzhiqiang",
  11. "sex": 1
  12. }
  13. ],
  14. "message": "ok",
  15. "status": 200
  16. }
出错
  1. {
  2. "message": "用户密码不正确!",
  3. "status": 355
  4. }

http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html


JsonParser  解析json文本的解析器,它将json文本解析成JsonElement树。

JsonElement 用来表示一个json元素的类,它可能是JsonObject,JsonArray,JsonPrimitive,JsonNull.

这样我们就可以首先解析跟服务器预定的交互格式了demo:

  1. try {
  2. String json = new String(response.data,
  3. HttpHeaderParser.parseCharset(response.headers));
  4. // #1 解析code message code=200&& message="ok"代表成功
  5. JsonPraser parser = new JsonParser();
  6. JsonObject root = parser.parse(json).getAsJsonObject();
  7. int code = root.get("code").getAsInt();
  8. String message = root.get("message").getAsString();
  9. if (code == HttpStatus.SC_OK) {// 操作成功
  10. return parseNetworkResponse(root, response);
  11. } else {
  12. return Response.error(new NetError(code, message));
  13. }
  14. } catch (UnsupportedEncodingException e) {
  15. return Response.error(new ParseError(e));
  16. } catch (com.google.gson.JsonSyntaxException e) {
  17. return Response.error(new ParseError(e));
  18. }
主要源码(请求使用volley):
  1. public abstract class DRequest<T> extends Request<T> {
  2. protected String KEY_CONTENT = "content";
  3. protected String KEY_DATA = "data";
  4. Map<String, String> mParams;
  5. public DRequest(String url,ErrorListener errorListener) {
  6. this(Method.POST, url,new HashMap<String, String>(),errorListener);
  7. }
  8. public DRequest(String url,Map<String, String> params,ErrorListener errorListener) {
  9. this(Method.POST, url,params,errorListener);
  10. }
  11. public DRequest(int method, String url,Map<String, String> params,ErrorListener errorListener) {
  12. super(method, url, errorListener);
  13. this.mParams = params;
  14. }
  15. @Override
  16. protected Response<T> parseNetworkResponse(NetworkResponse response) {
  17. try {
  18. String json = new String(response.data,
  19. HttpHeaderParser.parseCharset(response.headers));
  20. // #1 解析code message code=200&& message="ok"代表成功
  21. JsonParser parser = new JsonParser();
  22. JsonObject root = parser.parse(json).getAsJsonObject();
  23. int code = root.get("code").getAsInt();
  24. String message = root.get("message").getAsString();
  25. if (code == HttpStatus.SC_OK) {// 操作成功
  26. return parseNetworkResponse(root, response);
  27. } else {
  28. return Response.error(new NetError(code, message));
  29. }
  30. } catch (UnsupportedEncodingException e) {
  31. return Response.error(new ParseError(e));
  32. } catch (com.google.gson.JsonSyntaxException e) {
  33. return Response.error(new ParseError(e));
  34. }
  35. }
  36. @Override
  37. public Map<String, String> getParams() throws AuthFailureError {
  38. return mParams;
  39. }
  40. public void put(String key, String value) {
  41. mParams.put(key, value);
  42. }
  43. /**
  44. * 子类实现解析
  45. *
  46. * @param root
  47. * @param response
  48. * @return
  49. */
  50. public abstract Response<T> parseNetworkResponse(JsonObject root,
  51. NetworkResponse response);
  52. }
  1. public class DJsonRequest<T> extends DRequest<DataContainer<T>> {
  2. private Type type;
  3. private RequestHandler<T> handler;
  4. public DJsonRequest(String url,RequestHandler<T> handler, Type type) {
  5. super(url, handler);
  6. this.type = type;
  7. this.handler =handler;
  8. }
  9. public DJsonRequest(int method, String url,
  10. Map<String, String> params, RequestHandler<T> handler, Type type) {
  11. super(method,url, params,handler);
  12. this.type = type;
  13. this.handler =handler;
  14. }
  15. @Override
  16. public Response<DataContainer<T>> parseNetworkResponse(JsonObject root,
  17. NetworkResponse response) {
  18. Log.d("MyNet","获得响应");
  19. // data 元素
  20. JsonElement dataElement = root.get(KEY_DATA);
  21. if (dataElement.isJsonNull()) {// 不存在数据
  22. return Response.error(new NetError(703, "data空!"));
  23. }
  24. JsonObject data = dataElement.getAsJsonObject();
  25. JsonElement contentElement = data.get(KEY_CONTENT);
  26. if (contentElement.isJsonNull()) {// content 里面是null
  27. return Response.error(new NetError(702, "content空!"));
  28. }
  29. if (contentElement.isJsonObject()) {// conatent里面是对象
  30. T result = new Gson().fromJson(contentElement, type);
  31. DataContainer<T> container = new DataContainer<T>();
  32. container.dataSingle = result;
  33. return Response.success(container,
  34. HttpHeaderParser.parseCacheHeaders(response));
  35. }
  36. if (contentElement.isJsonArray()) {// 数组
  37. List<T> list = new Gson().fromJson(contentElement, type);
  38. DataContainer<T> container = new DataContainer<T>();
  39. container.dataList = list;
  40. return Response.success(container,
  41. HttpHeaderParser.parseCacheHeaders(response));
  42. }
  43. return Response.error(new NetError(703, "data空!"));
  44. }
  45. @Override
  46. protected void deliverResponse(DataContainer<T> response) {
  47. if (handler!=null) {
  48. handler.onResponse(response);
  49. }
  50. }
  51. }
注意(我的json格式中有content元素 )



现在我们直接解析data元素了  嬷嬷哒~










Gson实现自定义解析json格式的更多相关文章

  1. 用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  2. 使用GSON和泛型解析约定格式的JSON串(转)

    时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...

  3. $Java-json系列(一):用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  4. 使用google的GSON解析json格式的数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  5. 使用Gson送解析Json格式

    Java bean: package com.jingle.a; public class Person { public String name; public int age; public Pe ...

  6. Gson 是google解析Json的一个开源框架,同类的框架fastJson,JackJson

    Gson 是google解析Json的一个开源框架,同类的框架fastJson,JackJson等等 本人fastJson用了两年,也是从去年才开始接触Gson,希望下面的总结会对博友有用,至于Gso ...

  7. 解析json格式数据

    实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...

  8. Scala解析Json格式

    Scala解析Json格式 代码块 Scala原生包 导入包 import scala.util.parsing.json._ def main(args: Array[String]): Unit ...

  9. WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)

    DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...

随机推荐

  1. ios10 no route to host

    IdTCPClient1 ios10 no route to host IOS 9 正常 IOS10 出错,参考下面的设置解决问题 http://www.sh-huhe.com/solution/14 ...

  2. 配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份)

    备份 新建一个脚本/root/backup.py,内容如下: #!/usr/bin/env python# -*- coding: utf-8 -*- ''' 脚本作者:昨夜星辰 脚本作用:配合cro ...

  3. Java线程问题分析定位

    Java线程问题分析定位 分析步骤: 1.使用top命令查看系统资源占用情况,发现Java进程占用大量CPU资源,PID为11572: 2.显示进程详细列表命令:ps -mp 11572 -o THR ...

  4. HDOJ(1238) KMP

    Substrings http://acm.hdu.edu.cn/showproblem.php?pid=1238 先找到长度最短的字符串,把它的子串和该子串的逆序(按长度从大到小)依次与其他字符串匹 ...

  5. MVC开发基础

    新建--项目--ASP.NET MVC 4 WEB 应用程序 MVC: M--Model  模型层     放置数据访问类,linq V--View  视图层       界面层   aspx文件.只 ...

  6. java spring hibernate

    spring 如果配置让MultiActionController里的方法返回ModelAndView跳转到页面上 ****************************************** ...

  7. LeetCode Bulb Switcher 319

    变换灯泡颜色 There are n bulbs that are initially off. You first turn on all the bulbs. Then, you turn off ...

  8. maven 的使用

    下载Maven:http://maven.apache.org/ 解压 将解压目录的bin 子目录配置到 PATH中 4) 在命令行下运行 mvn -version  或者 mvn -v  来测试是否 ...

  9. sharepoint webpart

    SharePoint开发中,不仅仅是WebPart,我们都经常会使用的几个关键位置,如下: GAC: C:\Windows\assembly,也就是部署的位置: ISAPI位置,SharePoint ...

  10. MongoDB释放磁盘空间

    1. 先删除旧的文档db.remove({}): 2. 从副本集中移除待清理的成员: (1) 登录副本集中的 Primary 服务器(/opt/mongo1/bin/mongo --port 2701 ...