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 ...
随机推荐
- subline text3 删除行 快捷键设置
打开 首选项-->按键绑定 { "keys": ["ctrl+shift+k"], "command": "run_macr ...
- CocoaPods安装及使用《转》
http://www.cnblogs.com/eagley/p/5407721.html
- memcached tomcat maven 学习记录
2016.12.11 maven 快速搭建项目,只要有pom.xml文件配置好依赖 可以把项目切割(具体切割出来的块怎么用?) nginx 负载均衡 文件服务器 主要配置nginx.conf 文件 ...
- GPL 和BSD和Apache
开源许可证GPL.BSD.MIT.Mozilla.Apache和LGPL的区别<ignore_js_op> 以下是上述协议的简单介绍:BSD开源协议BSD开源协议是一个给于使用者很大自由的 ...
- python的类与对象
类与对象 1.什么是类 类和函数一样是程序编程的一种方式,在处理某些问题的时候类比函数更加适合让编程变得简化,在python里面函数式编程和类编程都是为了简化代码的一种编程方式,具体应用那个则由具体问 ...
- ng-style 的坑 - 对性能的影响
本文地址:http://www.cnblogs.com/jying/p/5633203.html 熟悉 angular 的前端对ng-style 一定不陌生,这个家伙可以绑定一个函数,使得我们可以在函 ...
- .NET Core Web 应用部署到 Docker 中运行
环境介绍 : 虚拟机:VirtualBox 5.1.6 系 统:Ubuntu 16.04.1 LTS 系统准备完成后可以使用 sudo apt-get udpate 和 sudo apt-get up ...
- vc++ 程序开机自启动和取消启动
//开机启动 int CMainWnd::CreateRun() { //添加以下代码 HKEY hKey; }; //得到程序自身的全路径 DWORD dwRet = GetModuleFileNa ...
- PRML
PRML 学习之 第一章 介绍 Introduction #欢迎共同学习和讨论,由于本文将不断修改,谢绝转载 模式识别问题具有重要且久远的历史.比如,16世纪开普勒发现行星运动定律,又如20世纪出发现 ...
- 第二章Java基础之标识符