Json(JavaScript Object Notation)是一种轻量级的数据交换格式,类似XML,但比XML更小更快更容易解析。当前各种流行的web应用框架都对Json提供良好的支持,各种流行开发语言也支持Json解析。

Java中解析Json的方式也很多,根据官方的JSONObject库,自己设计的一个抽象工具类:

Java代码  import java.io.Serializable;

import java.util.List;

import org.json.JSONException;

import org.json.JSONObject;

public abstract class JsonParser {

abstract List getListFromJson(String str);

abstract T getObjectFromJson(JSONObject jobj);

public T getObjectFromJson(String str) {

try {

JSONObject jsonObject = new JSONObject(str);

return getObjectFromJson(jsonObject);

} catch (JSONException e) {

e.printStackTrace();

} catch(Exception e){

e.printStackTrace();

}

return null;

}

protected String getValueByName(JSONObject jobj, String name)

throws JSONException{

if(jobj.has(name)){

return jobj.getString(name);

}

return null;

}

}

具体实现的子类如下:

Java代码  public class UserInfoParser extends JsonParser {

private UserInfoParser() {

}

@Override

List getListFromJson(String str) {

try {

JSONArray array = new JSONArray(str);

int len = array.length();

ArrayList list = new ArrayList(len);

for(int i=0;i

UserInfo info = getObjectFromJson(array.getJSONObject(i));

list.add(info);

}

return list;

} catch (JSONException e) {

e.printStackTrace();

}

return null;

}

@Override

UserInfo getObjectFromJson(JSONObject jobj) {

try {

UserInfo info = new UserInfo();

info.setId(getValueByName(jobj, UserInfo.NODE_ID));

info.setFace(getValueByName(jobj,UserInfo.NODE_FACE));

info.setUsername(getValueByName(jobj,UserInfo.NODE_USER_NAME));

return info;

} catch (JSONException e) {

e.printStackTrace();

}

return null;

}

}

当泛型值对象T,对应的数据结构比较简单,层次比较少的时候,官方的JSONObject库解析还过得去。当遇到层次较多(Json里面包含N个Json数组),数据结构复杂(Json由对个复杂数据的Json组成)的Json,解析速度就会大大降低!

在处理复杂Json结构时,我推荐使用Google的Gson解析库。刚刚接触Gson时,我有以下疑虑:

1、Gson对Json的支持度如何,能不能支持所有的Json结构?

2、由于Gson是基于Java的反射原理来实现的,解析的效率如何保证?

3、上手难度如何?

当我在项目实验性地引入Gson后,我o嘴了~~真不愧是Google出品,实属佳品!

再我的项目是基于android平台的App,使用Gson之前,不仅http请求和Json数据解析的耗时太长,而且内存占有一直居高不下。

使用Gson后,解析的时间缩短了30%(这只是Json的解析时间,不算上http请求的时间),内存占用足足减少了一半!!!最重要的是,开发效率还提高不少,何以见得,请看:

1、值对象必须实现序列化接口,成员属性的名称必须与Json数据的key一致,建议遵从J2EE的标准,使用get-set方法控制属性的访问,因为Json的key是后台应用定义的,假如后台与前台的开发语言不同,命名规范也不一致,使用get-set能有效分离这些不规范的命名到其他模块代码中去。

Java代码  public class UserInfo implements Serializable {

private static final long serialVersionUID = 1050128890144400614L;

private String id;

private String username;

private String face;

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getUsername() {

return username;

}

public void setUsername(String username) {

this.username = username;

}

public String getFace() {

return face;

}

public void setFace(String face) {

this.face = face;

}

}

2、奉上一个基于Gson的Json解析封装工具:

Java代码  /**

* Gson类库的封装工具类,专门负责解析json数据

* 内部实现了Gson对象的单例

* @author zhiweiofli

* @version 1.0

* @since 2012-9-18

*/

public class JsonUtil {

private static Gson gson = null;

static {

if (gson == null) {

gson = new Gson();

}

}

private JsonUtil() {

}

/**

* 将对象转换成json格式

*

* @param ts

* @return

*/

public static String objectToJson(Object ts) {

String jsonStr = null;

if (gson != null) {

jsonStr = gson.toJson(ts);

}

return jsonStr;

}

/**

* 将对象转换成json格式(并自定义日期格式)

*

* @param ts

* @return

*/

public static String objectToJsonDateSerializer(Object ts,

final String dateformat) {

String jsonStr = null;

gson = new GsonBuilder()

.registerTypeHierarchyAdapter(Date.class,

new JsonSerializer() {

public JsonElement serialize(Date src,

Type typeOfSrc,

JsonSerializationContext context) {

SimpleDateFormat format = new SimpleDateFormat(

dateformat);

return new JsonPrimitive(format.format(src));

}

}).setDateFormat(dateformat).create();

if (gson != null) {

jsonStr = gson.toJson(ts);

}

return jsonStr;

}

/**

* 将json格式转换成list对象

*

* @param jsonStr

* @return

*/

public static List> jsonToList(String jsonStr) {

List> objList = null;

if (gson != null) {

java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken>() {

}.getType();

objList = gson.fromJson(jsonStr, type);

}

return objList;

}

/**

* 将json格式转换成list对象,并准确指定类型

* @param jsonStr

* @param type

* @return

*/

public static List> jsonToList(String jsonStr, java.lang.reflect.Type type) {

List> objList = null;

if (gson != null) {

objList = gson.fromJson(jsonStr, type);

}

return objList;

}

/**

* 将json格式转换成map对象

*

* @param jsonStr

* @return

*/

public static Map, ?> jsonToMap(String jsonStr) {

Map, ?> objMap = null;

if (gson != null) {

java.lang.reflect.Type type = new com.google.gson.reflect.TypeToken>() {

}.getType();

objMap = gson.fromJson(jsonStr, type);

}

return objMap;

}

/**

* 将json转换成bean对象

*

* @param jsonStr

* @return

*/

public static Object jsonToBean(String jsonStr, Class> cl) {

Object obj = null;

if (gson != null) {

obj = gson.fromJson(jsonStr, cl);

}

return obj;

}

/**

* 将json转换成bean对象

*

* @param jsonStr

* @param cl

* @return

*/

@SuppressWarnings("unchecked")

public static  T jsonToBeanDateSerializer(String jsonStr, Class cl,

final String pattern) {

Object obj = null;

gson = new GsonBuilder()

.registerTypeAdapter(Date.class, new JsonDeserializer() {

public Date deserialize(JsonElement json, Type typeOfT,

JsonDeserializationContext context)

throws JsonParseException {

SimpleDateFormat format = new SimpleDateFormat(pattern);

String dateStr = json.getAsString();

try {

return format.parse(dateStr);

} catch (ParseException e) {

e.printStackTrace();

}

return null;

}

}).setDateFormat(pattern).create();

if (gson != null) {

obj = gson.fromJson(jsonStr, cl);

}

return (T) obj;

}

/**

* 根据

*

* @param jsonStr

* @param key

* @return

*/

public static Object getJsonValue(String jsonStr, String key) {

Object rulsObj = null;

Map, ?> rulsMap = jsonToMap(jsonStr);

if (rulsMap != null && rulsMap.size() > 0) {

rulsObj = rulsMap.get(key);

}

return rulsObj;

}

}

引用方式十分简单:

Java代码  (UserInfo)JsonUtil.jsonToBean(jsonString, UserInfo.class);

3、解析复杂Json的方式

Gson支持解析多层结构的Json,当然对于多层解析的效率,暂时还没测试过,估计效率下降不会超过JSONObject...

想解析Json中的Json,Json中的Json数组,Gson提供InstanceCreator结构,来实例化对应的对象,用来加载已解析的json数据。估计解析的流程是,Gson反射属性名称前,先考量能否获得其对应的实例,再对属性对象进行反射、赋值,如此迭代进行...

例如,解析Json数组的方式,实现:

Java代码  public class UserInfoResult extends ResponseState implements InstanceCreator>{

private static final long serialVersionUID = -8701527648781449574L;

public List userlist;

@Override

public List createInstance(Type arg0) {

return new ArrayList(2);

}

}

对比JSONObject,Gson的好处在于:

1、高效,安全的反射,带来高效的解析速度

2、简化的开发流程,对比JSONObject每次都要设计解析的对象,Gson只需要设计值对象,由此带来的就是敏捷的开发

3、良好的支持,Gson属于开源项目,项目位于http://code.google.com/p/google-gson/,现在版本还在不断升级中,建议使用最新的稳定版。

gson解析json maven_Gson解析Json相关推荐

  1. Android JSON数据解析(GSON方式)

    要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Jav ...

  2. JSON数据解析及gson.jar包

    从服务器端接收数据的时候,那些数据必须以浏览器能够理解的格式来发送. 服务器端的编程语言只能以如下 3 种格式返回数据: HTML XML JSON JSON一种简单的数据格式,比xml更轻巧. JS ...

  3. JSON数据解析:Gson(谷歌)和fastjson(阿里巴巴)的异同点

    Gson和fastjson分别为谷歌和阿里巴巴对JSON数据进行处理封装的jar包 Gson(谷歌)和fastjson(阿里巴巴)两者异同点: 相同点:都是根据JSON数据创建相应的类不同点: 1.调 ...

  4. Java学习总结(二十)——JSON解析:官方解析,GSON解析,FastJSON解析,

    一.JSON简介: 1.JSON(javaScript Object Notation)是一种轻量级的数据交换格式: 2.JSON数据作为目前网络中主流的数据传输格式之一,应用十分广泛: 3.JSON ...

  5. android jackson 解析json字符串,android:json解析的两个工具:Gson和Jackson的使用小样例...

    1.简单介绍 json是android与server通信过程中经常使用的数据格式,比如.例如以下是一个json格式的字符串: {"address":"Nanjing&qu ...

  6. 基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件

    基于流式输入输出 使用Java借助GSON库 实现对大型asc文件的读入解析 并输出为JSON文件 致谢 1 为什么要使用流式输入输出(使用情景) 2 目标.主要思路及相关方法 2.1 目标 2.2 ...

  7. Rxjava、Retrofit返回json数据解析异常处理

    每个App都避免不了要进行网络请求,从最开始的用谷歌封装的volley到再到android-async-http再到OKHttpUtils再到现在的Retrofit和RxJava,从我自己用后的体验来 ...

  8. Ace教你一步一步做Android新闻客户端(三) JSON数据解析

    对于服务器端来说,返回给客户端的数据格式一般分为html.xml和json这三种格式,现在给大家讲解一下json这个知识点, 1 如何通过json-lib和gson这两个json解析库来对解析我们的j ...

  9. java解析与生成json数据的四种方式,比如将json字符串转为json对象或json对象转为json字符串

    文章目录 1. 详说json 1.1 何为json 1.2 json语法 2. Java解析与生成JSON的四种方式 2.1 传统方式 2.2 利用Jackson方式 2.3 利用Gson方式 2.4 ...

最新文章

  1. 二叉搜索树的第k个节点java_剑指Offer62:二叉搜索树的第k个结点(Java)
  2. 深度学习100例 | 第27天-卷积神经网络(CNN):艺术作品识别
  3. CSS3:CSS3 文本效果
  4. react中使用构建缓存_使用React和Netlify从头开始构建电子商务网站
  5. 测试驱动开发 测试前移_为什么测试驱动的开发有用?
  6. maven 打包时缺少文件_maven父子工程---子模块相互依赖打包时所遇到的问题:依赖的程序包找不到...
  7. 旷视科技IPO过会,AI技术“立业”难言轻松
  8. hdu 1142 记忆化搜索
  9. Winform主窗体的设置
  10. Xamarin.Forms Layout Challenges – Great Places(已全文翻译)
  11. 如何将三万行代码从 Flow 移植到 TypeScript?
  12. struts2中处理get请求乱码
  13. 利用反射实现工厂模式
  14. rocketmq源码调试
  15. 持续集成、持续交付、微服务----微服务
  16. 商业银行的设立与组织形式-单一银行制、分支银行制、持股公司制、连锁银行制、代理银行制...
  17. android egl 代码,Android配置EGL环境
  18. 关于十六进制发送和显示(VS上位机和下位机)
  19. 估算的合同总价与实际的合同总价
  20. 蓝桥 卷“兔”来袭编程竞赛专场-08列置换加密 题解

热门文章

  1. 分享Laravel中blade页面更改没有及时显示在页面的问题解决方案
  2. 关于loadtxt编码问题的解决方法
  3. Win10远程桌面失败,这可能是由于CredSSP加密Oracle修正 解决方法
  4. 对接第三方平台JAVA接口问题推送和解决
  5. 如何更改微调器的文字大小和文字颜色?
  6. 正则表达式用单个空格替换多个空格
  7. 如何在SQL中使用JOIN执行UPDATE语句?
  8. 华为9.0系统机器一键激活xposed框架的流程
  9. vue移动端优秀框架收集
  10. 一个使用react native实现的短视频APP