Gson实现自定义解析json格式
客户端跟服务器交互的时候我们使用json实现 但是 在交互的时候除了传送json对象数据意外 我们还需要传输标志位等
{
"data": {
"age": 29,
"name": "wangzhiqiang",
"sex": 1
},
"message": "ok",
"status": 200
}
{
"data": [
{
"age": 29,
"name": "wangzhiqiang",
"sex": 1
},
{
"age": 29,
"name": "wangzhiqiang",
"sex": 1
}
],
"message": "ok",
"status": 200
}
{
"message": "用户密码不正确!",
"status": 355
}
http://google-gson.googlecode.com/svn/trunk/gson/docs/javadocs/index.html
JsonParser 解析json文本的解析器,它将json文本解析成JsonElement树。
try {
String json = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
// #1 解析code message code=200&& message="ok"代表成功
JsonPraser parser = new JsonParser();
JsonObject root = parser.parse(json).getAsJsonObject();
int code = root.get("code").getAsInt();
String message = root.get("message").getAsString();
if (code == HttpStatus.SC_OK) {// 操作成功
return parseNetworkResponse(root, response);
} else {
return Response.error(new NetError(code, message));
}
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (com.google.gson.JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
public abstract class DRequest<T> extends Request<T> {
protected String KEY_CONTENT = "content";
protected String KEY_DATA = "data";
Map<String, String> mParams;
public DRequest(String url,ErrorListener errorListener) {
this(Method.POST, url,new HashMap<String, String>(),errorListener);
}
public DRequest(String url,Map<String, String> params,ErrorListener errorListener) {
this(Method.POST, url,params,errorListener);
}
public DRequest(int method, String url,Map<String, String> params,ErrorListener errorListener) {
super(method, url, errorListener);
this.mParams = params;
}
@Override
protected Response<T> parseNetworkResponse(NetworkResponse response) {
try {
String json = new String(response.data,
HttpHeaderParser.parseCharset(response.headers));
// #1 解析code message code=200&& message="ok"代表成功
JsonParser parser = new JsonParser();
JsonObject root = parser.parse(json).getAsJsonObject();
int code = root.get("code").getAsInt();
String message = root.get("message").getAsString();
if (code == HttpStatus.SC_OK) {// 操作成功
return parseNetworkResponse(root, response);
} else {
return Response.error(new NetError(code, message));
}
} catch (UnsupportedEncodingException e) {
return Response.error(new ParseError(e));
} catch (com.google.gson.JsonSyntaxException e) {
return Response.error(new ParseError(e));
}
}
@Override
public Map<String, String> getParams() throws AuthFailureError {
return mParams;
}
public void put(String key, String value) {
mParams.put(key, value);
}
/**
* 子类实现解析
*
* @param root
* @param response
* @return
*/
public abstract Response<T> parseNetworkResponse(JsonObject root,
NetworkResponse response);
}
public class DJsonRequest<T> extends DRequest<DataContainer<T>> {
private Type type;
private RequestHandler<T> handler;
public DJsonRequest(String url,RequestHandler<T> handler, Type type) {
super(url, handler);
this.type = type;
this.handler =handler;
}
public DJsonRequest(int method, String url,
Map<String, String> params, RequestHandler<T> handler, Type type) {
super(method,url, params,handler);
this.type = type;
this.handler =handler;
}
@Override
public Response<DataContainer<T>> parseNetworkResponse(JsonObject root,
NetworkResponse response) {
Log.d("MyNet","获得响应");
// data 元素
JsonElement dataElement = root.get(KEY_DATA);
if (dataElement.isJsonNull()) {// 不存在数据
return Response.error(new NetError(703, "data空!"));
}
JsonObject data = dataElement.getAsJsonObject();
JsonElement contentElement = data.get(KEY_CONTENT);
if (contentElement.isJsonNull()) {// content 里面是null
return Response.error(new NetError(702, "content空!"));
}
if (contentElement.isJsonObject()) {// conatent里面是对象
T result = new Gson().fromJson(contentElement, type);
DataContainer<T> container = new DataContainer<T>();
container.dataSingle = result;
return Response.success(container,
HttpHeaderParser.parseCacheHeaders(response));
}
if (contentElement.isJsonArray()) {// 数组
List<T> list = new Gson().fromJson(contentElement, type);
DataContainer<T> container = new DataContainer<T>();
container.dataList = list;
return Response.success(container,
HttpHeaderParser.parseCacheHeaders(response));
}
return Response.error(new NetError(703, "data空!"));
}
@Override
protected void deliverResponse(DataContainer<T> response) {
if (handler!=null) {
handler.onResponse(response);
}
}
}
Gson实现自定义解析json格式的更多相关文章
- 用GSON解析Json格式数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...
- 使用GSON和泛型解析约定格式的JSON串(转)
时间紧张,先记一笔,后续优化与完善. 解决的问题: 使用GSON和泛型解析约定格式的JSON串. 背景介绍: 1.使用GSON来进行JSON串与java代码的互相转换. 2.JSON的格式如下三种: ...
- $Java-json系列(一):用GSON解析Json格式数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...
- 使用google的GSON解析json格式的数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...
- 使用Gson送解析Json格式
Java bean: package com.jingle.a; public class Person { public String name; public int age; public Pe ...
- Gson 是google解析Json的一个开源框架,同类的框架fastJson,JackJson
Gson 是google解析Json的一个开源框架,同类的框架fastJson,JackJson等等 本人fastJson用了两年,也是从去年才开始接触Gson,希望下面的总结会对博友有用,至于Gso ...
- 解析json格式数据
实现目标 读取文件中的json格式数据,一行为一条json格式数据.进行解析封装成实体类. 通过google的Gson对象解析json格式数据 我现在解析的json格式数据为: {",&qu ...
- Scala解析Json格式
Scala解析Json格式 代码块 Scala原生包 导入包 import scala.util.parsing.json._ def main(args: Array[String]): Unit ...
- WP8解析JSON格式(使用DataContractJsonSerializer类)(推荐)
DataContractJsonSerializer是.NET自带的类,在解析JSON格式的时候使用起来方便快捷,至于生成方面由于暂时没用到就没去看了.使用需要引用System.Runtime.Ser ...
随机推荐
- Ninject之旅之六:Ninject约定
摘要 在小的应用系统中一个一个注册一些服务类型不怎么困难.但是,如果是一个实际的有上百个服务的应用程序呢?约定配置允许我们使用约定绑定一组服务,而不用一个一个分别绑定. 要使用约定配置,需要添加Nin ...
- Windows Server 2012 R2 IIS8.5+PHP(FastCGI)+MySQL环境搭建教程
原文地址:http://www.osyunwei.com/archives/7378.html 搬运是为了自己找资料方便. 准备篇 一.环境说明: 操作系统:Windows Server 2012 R ...
- Windows程序设再读笔记00-序言
最近打算重新读windows程序设计这本书,这是我第二次读这本书,上一次读已经是七八年前的事情了.当初读的时候,刚刚接触windows开发不久,很多东西都不能够完全理解.这几天重新读了几章,发现收获不 ...
- C#中string在内存中是如何表示的
不知道你是否有过和我一样的疑问,不同编码的字符串是如何存储在运行时的内存中的呢,计算机在操作string类型的对象时,如何知道这个string是什么编码呢?和文本文件那样有类似BOM的东东在strin ...
- 第三课:sea.js模块加载原理
模块加载,其实就是把js分成很多个模块,便于开发和维护.因此加载很多js模块的时候,需要动态的加载,以便提高用户体验. 在介绍模块加载库之前,先介绍一个方法. 动态加载js方法: function l ...
- VC++ 截屏代码,并保存为想要的格式(BMP,JPG,PNG,GIF等格式)
void CCaptionScreenDlg::Screen(char* filename) { HDC hdcSrc = ::GetDC(NULL); int nBitPerPixel = GetD ...
- iOS高效开发必备的10款Objective-C类库
http://blog.csdn.net/yhawaii/article/details/7392988
- docker 数据卷 权限
1,在运行容器的时候,给容器加特权: 示例:docker run -i -t --privileged=true -v /home/docs:/src waterchestnut/nodejs:0.1 ...
- socket网络通信
1.socket通常也称作"套接字",用于描述IP地址和端口.在internet上的主机一般运行了多个服务软件,同时提供几种服务,每种服务都打开一个socket,并绑定到一个端口上 ...
- Tomcat 设置
bin/catalina.bat--增加内存 set JAVA_OPTS=...后面加上 set JAVA_OPTS=-Xmx1024M -Xms512M -XX:MaxPermSize=256m c ...