- 浏览: 137259 次
- 性别:
- 来自: 武汉
文章分类
最新评论
-
gezi2213:
...
HttpClient及有关jar包详解 -
sailor119:
学习一下!
〖ExtJS〗之ToolBar
Json(JavaScript Object Notation)是一种轻量级的数据交换格式,类似XML,但比XML更小更快更容易解析。当前各种流行的web应用框架都对Json提供良好的支持,各种流行开发语言也支持Json解析。
Java中解析Json的方式也很多,根据官方的JSONObject库,自己设计的一个抽象工具类:
- import java.io.Serializable;
- import java.util.List;
- import org.json.JSONException;
- import org.json.JSONObject;
- public abstract class JsonParser <T extends Serializable>{
- abstract List<T> 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 ;
- }
- }
具体实现的子类如下:
- public class UserInfoParser extends JsonParser<UserInfo> {
- private UserInfoParser() {
- }
- @Override
- List<UserInfo> getListFromJson(String str) {
- try {
- JSONArray array = new JSONArray(str);
- int len = array.length();
- ArrayList<UserInfo> list = new ArrayList<UserInfo>(len);
- for ( int i= 0 ;i<len;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能有效分离这些不规范的命名到其他模块代码 中去。
- 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解析封装工具:
- /**
- * Gson类库的封装工具类,专门负责解析json数据</br>
- * 内部实现了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<Date>() {
- 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<List<?>>() {
- }.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<Map<?, ?>>() {
- }.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> T jsonToBeanDateSerializer(String jsonStr, Class<T> cl,
- final String pattern) {
- Object obj = null ;
- gson = new GsonBuilder()
- .registerTypeAdapter(Date.class , new JsonDeserializer<Date>() {
- 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;
- }
- }
引用方式十分简单:
3、解析复杂Json的方式
Gson支持解析多层结构的Json,当然对于多层解析的效率,暂时还没测试过,估计效率下降不会超过JSONObject...
想解析Json中的Json,Json中的Json数组,Gson提供InstanceCreator结构,来实例化对应的对象,用来加载已解析的 json数据。估计解析的流程是,Gson反射属性名称前,先考量能否获得其对应的实例,再对属性对象进行反射、赋值,如此迭代进行...
例如,解析Json数组的方式,实现:
- public class UserInfoResult extends ResponseState implements InstanceCreator<List<UserInfo>>{
- private static final long serialVersionUID = -8701527648781449574L;
- public List<UserInfo> userlist;
- @Override
- public List<UserInfo> createInstance(Type arg0) {
- return new ArrayList<UserInfo>( 2 );
- }
- }
对比JSONObject,Gson的好处在于:
1、高效,安全的反射,带来高效的解析速度
2、简化的开发流程,对比JSONObject每次都要设计解析的对象,Gson只需要设计值对象,由此带来的就是敏捷的开发
3、良好的支持,Gson属于开源项目,项目位于http://code.google.com/p/google-gson/ ,现在版本还在不断升级中,建议使用最新的稳定版。
最后,本文只对比介绍了Gson对Json解析的方面,对于Json的自动化生成,注释的使用,容以后再分享...
相关推荐
本教程将深入探讨如何使用Gson库解析复杂的JSON实例,让你只需寥寥几行代码就能轻松处理JSON解析问题。 ### Gson库简介 Gson库的核心功能是将Java对象(如自定义类)转换为JSON字符串,反之亦然。这个库非常直观,...
Gson 解析复杂 JSON 数据 Gson 是一个由 Google 开发的 Java 库,用来将 Java 对象转换...在解析 JSON 数据时,我们需要使用 Gson 库提供的注解来指定 JSON 字段对应的 Java 字段,并使用 TypeToken 来指定嵌套结构。
在Android开发中,数据交换和存储经常涉及到JSON格式,因为它是一种轻量级、易于阅读和编写的文本...在实际项目中,结合Android Studio的强大功能,Gson能够帮助开发者快速实现JSON数据的解析和生成,提高开发效率。
Gson是Google开发的一款Java库,用于在Java对象和JSON数据之间进行映射。它使得在Java应用程序中处理JSON变得非常简单,无论是将JSON转换为等效的Java对象,还是将Java对象转换为JSON格式的字符串。在本文中,我们将...
Gson库通过`Gson`类来实现JSON与Java对象的转换。当你有一个Java对象并想将其转化为JSON字符串时,可以使用`Gson().toJson()`方法;反之,如果你有一个JSON字符串并想解析成Java对象,可以使用`Gson().fromJson()`...
本篇文章将深入探讨JSON解析以及Gson库的使用方法。 一、JSON解析基础 JSON是一种独立于语言的数据表示格式,其结构清晰,易于人阅读和编写,同时也容易让机器解析和生成。JSON主要由键值对(key-value pairs)...
Gson是Google推出的一个JSON解析器库,用于将JSON字符串解析成Java对象,或者将Java对象转换成JSON字符串。Gson提供了一个简单的API,用于解析和生成JSON数据。使用Gson可以简化JSON数据的处理,提高开发效率。 ...
本篇文章将详细阐述如何使用Gson库解析JSON文件,帮助开发者理解并掌握这一技能。 首先,我们需要了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于...
本示例“GsonDemo”将详细介绍如何利用Gson库进行JSON的解析和反序列化。Gson库的强大之处在于它可以将Java对象转换为JSON字符串,反之亦然,使得JSON数据和Java对象之间的转换变得简单易行。 首先,我们了解下JSON...
这个压缩包文件"JSON-java-master"很可能包含了Gson库的源代码,允许你查看和学习其内部实现。 Gson的核心功能在于提供了一种简洁的方式来序列化和反序列化Java对象为JSON字符串。序列化是将Java对象转换为JSON的...
在"解析json的gson"这一主题中,我们将深入探讨Gson库的主要特性和使用方法。首先,我们来看如何创建一个简单的JSON对象。在Java中,你可以定义一个类来表示你的数据结构,然后使用Gson库将其转换为JSON字符串: ``...
本文将深入探讨三种广泛使用的JSON解析库:原生的`json`库,阿里巴巴的`fastjson`,以及Google的`gson`。 ### 1. 原生`json`库 Android系统内建了一个简单的`org.json`库,提供基本的JSON操作。它包括`JSONObject`...
2. **JsonParser类**:这个类提供了低级别的JSON解析,可以逐个解析JSON元素,对于复杂或动态的JSON结构,这种方式更为灵活。 3. **JsonElement类**:这是解析JSON后的抽象基类,包括JsonNull、JsonObject、...
本示例"GsonDemo"将深入探讨如何使用Gson库来解析JSON数据。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,广泛应用于Web服务和客户端之间的数据传输。 首先,我们需要导入Gson库。如果你的项目...
GSON的强大之处在于它可以自动映射JSON数据到Java对象,大大简化了JSON解析和序列化的过程。 以下是关于JSON和GSON在Android开发中的具体知识点: 1. JSON基本结构:JSON包含两种主要数据结构,对象(Object)和数...
1、生成Json数据 2、使用Gson解析Json数据(单个json对象、json数组和json对象内嵌json数组) // 这里有两篇好心人的博文,有详细的讲解 http://www.jb51.net/article/32547.htm ...
使用GSON进行JSON解析的基本操作如下: 1. **序列化**:将Java对象转换为JSON字符串。 ```java Gson gson = new Gson(); String jsonString = gson.toJson(yourJavaObject); ``` 2. **反序列化**:将JSON字符...
在Java开发中,Gson库是Google提供的一款强大的JSON处理工具,它允许我们将Java对象转换为JSON字符串,同时也能够将JSON数据反序列化为Java对象。当我们遇到嵌套的JSON数据时,Gson也能优雅地处理。嵌套的JSON通常...
在Android开发中,Gson库是Google提供的一个强大的JSON数据解析工具,它使得Java对象与JSON数据之间的转换变得简单易行。本篇文章将详细介绍如何在Android应用中使用Gson库解析JSON数据,以便更好地理解这一关键知识...