- 浏览: 515436 次
- 性别:
- 来自: 广州
文章分类
最新评论
-
u010169720:
而且fragment调用back也有不需要finish的时候呢 ...
android异常:Can not perform this action after onSaveInstanc -
u010169720:
我这里就是拦截的,但是还是报了这个
android异常:Can not perform this action after onSaveInstanc -
Salijing:
IT之冕 写道 我的方法是注释掉super.onBackPre ...
android异常:Can not perform this action after onSaveInstanc -
cainiao1923:
上线毛啊,Bad request了
基于NodeJs开发的独立博客系统~~上线啦 -
cainiao1923:
不错 !!!!!!!!!!!!!!
在Android上实现Java和Js交互
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; } }
引用方式十分简单:
(UserInfo)JsonUtil.jsonToBean(jsonString, UserInfo.class);
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的自动化生成,注释的使用,容以后再分享...
评论
有空要试试看,谢谢推荐
发表评论
-
【翻译】高效的double-checked线程锁
2014-05-07 10:44 1719代码的性能是最 ... -
【翻译】 Android上实现文字围绕图片的布局
2014-04-09 16:31 3450在这边文章中,我将会介绍如何去实现一个在An ... -
【翻译】Android多线程下安全访问数据库
2014-04-08 11:21 11497为了记录如何线程安全地访问你的Android数 ... -
Android Robotium小结
2014-03-17 15:41 2368Robotium 是一款基于Android instrum ... -
Monkeyrunner小结
2014-03-15 23:49 6572Monkeyrunner----Android tools ... -
(翻译)Java常用库
2013-11-15 11:32 2637典型的Java项目总会引用各种第三方库。本文为各种不同的应 ... -
Android开发陷阱:利用PendingIntent传递唯一的Intent
2013-11-07 11:36 42149PendingIntent 是对真实 ... -
Android开发陷阱:利用PendingIntent传递唯一的Intent
2013-11-07 11:29 0PendingIntent 是对真实 ... -
GridView的特殊派生应用
2013-11-06 17:07 2160一、ScrollView + GridView 在Sc ... -
java反射机制调用有参构造函数生成类
2013-11-05 15:57 6770在使用Java反射时,总是只记着: Class. ... -
Android的ps命令介绍和技巧
2013-07-05 18:37 6672在Linux下,ps是非常普 ... -
在Android上实现Java和Js交互
2013-07-05 18:34 28276其实webview加载资源的速度并不慢,但是如果资源多 ... -
TextView的日常使用技巧
2013-07-05 18:29 5050Textview在日常开发工作中使用非常频繁,在这里 ... -
毫秒转换时间 In Java
2013-06-06 19:22 0时间处理在编码过程中非常频繁,例如获得当前的系统时间啊, ... -
Android NDK开发之Jni调用Java对象
2013-03-16 00:11 26463本地代码中使用Java对 ... -
Android NDK开发之数组类型的操作
2013-03-16 00:05 8849Jni 可以通过JNIEnv提供的方法,对传过来的Java ... -
Android NDK开发之Jni的数据类型
2013-03-16 00:03 11403在前面的一篇博客《And ... -
Android NDK开发简介
2013-03-07 15:12 5923最近由于项目的 ... -
Android的NDK开发~SQLite3
2013-02-05 14:02 0What? NDK的N,即native,NDK开发,是指使 ... -
Android的NDK开发~Hellow world!
2013-02-05 13:52 24581、到Google官网下载adt- ...
相关推荐
本教程将深入探讨如何使用Gson库解析复杂的JSON实例,让你只需寥寥几行代码就能轻松处理JSON解析问题。 ### Gson库简介 Gson库的核心功能是将Java对象(如自定义类)转换为JSON字符串,反之亦然。这个库非常直观,...
本篇文章将深入探讨JSON解析以及Gson库的使用方法。 一、JSON解析基础 JSON是一种独立于语言的数据表示格式,其结构清晰,易于人阅读和编写,同时也容易让机器解析和生成。JSON主要由键值对(key-value pairs)...
**Android JSON解析框架GSON详解** 在Android应用开发中,数据交换经常采用JSON格式,因为它轻量级、易于阅读和编写,并且被广泛支持。为了高效地解析和生成JSON,Google提供了一个强大的库——GSON。GSON允许将...
Gson是Google开发的一款Java库,用于在Java对象和JSON数据之间进行映射。它使得在Java应用程序中处理JSON变得非常简单,无论是将JSON转换为等效的Java对象,还是将Java对象转换为JSON格式的字符串。在本文中,我们将...
在"解析json的gson"这一主题中,我们将深入探讨Gson库的主要特性和使用方法。首先,我们来看如何创建一个简单的JSON对象。在Java中,你可以定义一个类来表示你的数据结构,然后使用Gson库将其转换为JSON字符串: ``...
2. **JSON字符串到对象的转换**:相反,GSON也支持将JSON字符串解析为Java对象。这通常通过`fromJson()`方法实现,它接受一个JSON字符串和目标类型的Class对象,返回一个Java对象。 ```java User user = gson.from...
本篇文章将详细阐述如何使用Gson库解析JSON文件,帮助开发者理解并掌握这一技能。 首先,我们需要了解什么是JSON。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于...
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 ...
- **JsonReader与JsonWriter**:Gson库提供了JsonReader和JsonWriter两个类,分别用于解析JSON输入流和生成JSON输出流。它们提供了逐字段读写JSON数据的方法,适用于处理复杂的JSON结构。 2. **GsonBuilder**: ...
使用GSON进行JSON解析的基本操作如下: 1. **序列化**:将Java对象转换为JSON字符串。 ```java Gson gson = new Gson(); String jsonString = gson.toJson(yourJavaObject); ``` 2. **反序列化**:将JSON字符...
总结来说,这三个JSON解析库各有优势。Gson以其强大的类型映射和灵活性深受喜爱;Fastjson凭借其高效的性能和简洁的API赢得了开发者的心;而org.json则因其轻量级和易用性在某些场景下成为不错的选择。在实际项目中...
本文将深入探讨三种广泛使用的JSON解析库:原生的`json`库,阿里巴巴的`fastjson`,以及Google的`gson`。 ### 1. 原生`json`库 Android系统内建了一个简单的`org.json`库,提供基本的JSON操作。它包括`JSONObject`...
Gson是Google推出的一个JSON解析器库,用于将JSON字符串解析成Java对象,或者将Java对象转换成JSON字符串。Gson提供了一个简单的API,用于解析和生成JSON数据。使用Gson可以简化JSON数据的处理,提高开发效率。 ...
二、Android中的JSON解析 在Android中,我们通常使用`org.json`库或`com.google.gson`库来解析JSON数据。 1. `org.json`库:这是Android SDK自带的一个轻量级库,主要用于解析简单的JSON数据。 - JSONObject:...
为了方便地将JSON字符串转换为Java对象或反之,开发者通常会借助于特定的库,其中最常用的两个是Gson和Fastjson。 **Gson** Gson是由Google提供的一个开源库,其主要功能是将Java对象转换为对应的JSON字符串,以及...
本文将通过一个具体的例子来探讨如何使用Google提供的Gson库来进行复杂的JSON数据解析。 #### JSON概述 JSON是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。它基于JavaScript的一个...
Gson 解析复杂 JSON 数据 Gson 是一个由 Google 开发的 Java 库,用来将 Java 对象转换...在解析 JSON 数据时,我们需要使用 Gson 库提供的注解来指定 JSON 字段对应的 Java 字段,并使用 TypeToken 来指定嵌套结构。
Gson的优势在于其强大的类型安全性和自动序列化/反序列化功能,使得开发者无需手动编写繁琐的JSON解析代码。 在Java开发中,为了使用JSON和Gson,你需要包含以下jar包: 1. **json.jar**:这是处理JSON的基本库,...
在Android Studio中,Gson库可以帮助我们方便地解析和生成JSON数据。本篇文章将详细介绍如何在Android Studio环境下使用Google Gson解析Json数据。 首先,我们需要在项目中引入Gson库。打开build.gradle模块文件,...