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

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

对象
    1. {
    1. "data": {
    1. "age": 29,
    1. "name": "wangzhiqiang",
    1. "sex": 1
    1. },
    1. "message": "ok",
    1. "status": 200
    1. }
列表
    1. {
    1. "data": [
    1. {
    1. "age": 29,
    1. "name": "wangzhiqiang",
    1. "sex": 1
    1. },
    1. {
    1. "age": 29,
    1. "name": "wangzhiqiang",
    1. "sex": 1
    1. }
    1. ],
    1. "message": "ok",
    1. "status": 200
    1. }
出错
    1. {
    1. "message": "用户密码不正确!",
    1. "status": 355
    1. }

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 {
    1. String json = new String(response.data,
    1. HttpHeaderParser.parseCharset(response.headers));
    1. // #1 解析code message code=200&& message="ok"代表成功
    1. JsonPraser parser = new JsonParser();
    1. JsonObject root = parser.parse(json).getAsJsonObject();
    1. int code = root.get("code").getAsInt();
    1. String message = root.get("message").getAsString();
    1. if (code == HttpStatus.SC_OK) {// 操作成功
    1. return parseNetworkResponse(root, response);
    1. } else {
    1. return Response.error(new NetError(code, message));
    1. }
    1. } catch (UnsupportedEncodingException e) {
    1. return Response.error(new ParseError(e));
    1. } catch (com.google.gson.JsonSyntaxException e) {
    1. return Response.error(new ParseError(e));
    1. }
主要源码(请求使用volley):
    1. public abstract class DRequest<T> extends Request<T> {
    1. protected String KEY_CONTENT = "content";
    1. protected String KEY_DATA = "data";
    1. Map<String, String> mParams;
    1. public DRequest(String url,ErrorListener errorListener) {
    1. this(Method.POST, url,new HashMap<String, String>(),errorListener);
    1. }
    1. public DRequest(String url,Map<String, String> params,ErrorListener errorListener) {
    1. this(Method.POST, url,params,errorListener);
    1. }
    1. public DRequest(int method, String url,Map<String, String> params,ErrorListener errorListener) {
    1. super(method, url, errorListener);
    1. this.mParams = params;
    1. }
    1. @Override
    1. protected Response<T> parseNetworkResponse(NetworkResponse response) {
    1. try {
    1. String json = new String(response.data,
    1. HttpHeaderParser.parseCharset(response.headers));
    1. // #1 解析code message code=200&& message="ok"代表成功
    1. JsonParser parser = new JsonParser();
    1. JsonObject root = parser.parse(json).getAsJsonObject();
    1. int code = root.get("code").getAsInt();
    1. String message = root.get("message").getAsString();
    1. if (code == HttpStatus.SC_OK) {// 操作成功
    1. return parseNetworkResponse(root, response);
    1. } else {
    1. return Response.error(new NetError(code, message));
    1. }
    1. } catch (UnsupportedEncodingException e) {
    1. return Response.error(new ParseError(e));
    1. } catch (com.google.gson.JsonSyntaxException e) {
    1. return Response.error(new ParseError(e));
    1. }
    1. }
    1. @Override
    1. public Map<String, String> getParams() throws AuthFailureError {
    1. return mParams;
    1. }
    1. public void put(String key, String value) {
    1. mParams.put(key, value);
    1. }
    1. /**
    1. * 子类实现解析
    1. *
    1. * @param root
    1. * @param response
    1. * @return
    1. */
    1. public abstract Response<T> parseNetworkResponse(JsonObject root,
    1. NetworkResponse response);
    1. }
    1. public class DJsonRequest<T> extends DRequest<DataContainer<T>> {
    1. private Type type;
    1. private RequestHandler<T> handler;
    1. public DJsonRequest(String url,RequestHandler<T> handler, Type type) {
    1. super(url, handler);
    1. this.type = type;
    1. this.handler =handler;
    1. }
    1. public DJsonRequest(int method, String url,
    1. Map<String, String> params, RequestHandler<T> handler, Type type) {
    1. super(method,url, params,handler);
    1. this.type = type;
    1. this.handler =handler;
    1. }
    1. @Override
    1. public Response<DataContainer<T>> parseNetworkResponse(JsonObject root,
    1. NetworkResponse response) {
    1. Log.d("MyNet","获得响应");
    1. // data 元素
    1. JsonElement dataElement = root.get(KEY_DATA);
    1. if (dataElement.isJsonNull()) {// 不存在数据
    1. return Response.error(new NetError(703, "data空!"));
    1. }
    1. JsonObject data = dataElement.getAsJsonObject();
    1. JsonElement contentElement = data.get(KEY_CONTENT);
    1. if (contentElement.isJsonNull()) {// content 里面是null
    1. return Response.error(new NetError(702, "content空!"));
    1. }
    1. if (contentElement.isJsonObject()) {// conatent里面是对象
    1. T result = new Gson().fromJson(contentElement, type);
    1. DataContainer<T> container = new DataContainer<T>();
    1. container.dataSingle = result;
    1. return Response.success(container,
    1. HttpHeaderParser.parseCacheHeaders(response));
    1. }
    1. if (contentElement.isJsonArray()) {// 数组
    1. List<T> list = new Gson().fromJson(contentElement, type);
    1. DataContainer<T> container = new DataContainer<T>();
    1. container.dataList = list;
    1. return Response.success(container,
    1. HttpHeaderParser.parseCacheHeaders(response));
    1. }
    1. return Response.error(new NetError(703, "data空!"));
    1. }
    1. @Override
    1. protected void deliverResponse(DataContainer<T> response) {
    1. if (handler!=null) {
    1. handler.onResponse(response);
    1. }
    1. }
    1. }
注意(我的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. Ninject之旅之六:Ninject约定

    摘要 在小的应用系统中一个一个注册一些服务类型不怎么困难.但是,如果是一个实际的有上百个服务的应用程序呢?约定配置允许我们使用约定绑定一组服务,而不用一个一个分别绑定. 要使用约定配置,需要添加Nin ...

  2. Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程

    原文地址:http://www.osyunwei.com/archives/7378.html 搬运是为了自己找资料方便. 准备篇 一.环境说明: 操作系统:Windows Server 2012 R ...

  3. Windows程序设再读笔记00-序言

    最近打算重新读windows程序设计这本书,这是我第二次读这本书,上一次读已经是七八年前的事情了.当初读的时候,刚刚接触windows开发不久,很多东西都不能够完全理解.这几天重新读了几章,发现收获不 ...

  4. C#中string在内存中是如何表示的

    不知道你是否有过和我一样的疑问,不同编码的字符串是如何存储在运行时的内存中的呢,计算机在操作string类型的对象时,如何知道这个string是什么编码呢?和文本文件那样有类似BOM的东东在strin ...

  5. 第三课:sea.js模块加载原理

    模块加载,其实就是把js分成很多个模块,便于开发和维护.因此加载很多js模块的时候,需要动态的加载,以便提高用户体验. 在介绍模块加载库之前,先介绍一个方法. 动态加载js方法: function l ...

  6. VC++ 截屏代码,并保存为想要的格式(BMP,JPG,PNG,GIF等格式)

    void CCaptionScreenDlg::Screen(char* filename) { HDC hdcSrc = ::GetDC(NULL); int nBitPerPixel = GetD ...

  7. iOS高效开发必备的10款Objective-C类库

    http://blog.csdn.net/yhawaii/article/details/7392988

  8. docker 数据卷 权限

    1,在运行容器的时候,给容器加特权: 示例:docker run -i -t --privileged=true -v /home/docs:/src waterchestnut/nodejs:0.1 ...

  9. socket网络通信

    1.socket通常也称作"套接字",用于描述IP地址和端口.在internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上 ...

  10. Tomcat 设置

    bin/catalina.bat--增加内存 set JAVA_OPTS=...后面加上 set JAVA_OPTS=-Xmx1024M -Xms512M -XX:MaxPermSize=256m c ...