Android JSON:Gson,FastJson解析库的使用和对比分析
2015-11-05 09:46
726 查看
一、概述
目前主流数据交换格式就是 Json和Xml,而 Json 格式使用范围可能更加的广并且可拓展性更强一些。本文章将对 Json 数据交换格式通过 Gson 和 FastJson 来实现在 Android 端的高效解析。
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,用于数据转换传输。
通用于PHP, Java, C++, C#, Python等编程语言数据交换传输。
易于人阅读和编写,同时也易于机器解析和生成。
基本结构:对象、数组。
Gson 的简介和特点:
Gson 是 Google 提供的用来在 Java 对象和 JSON 数据之间进行映射的 Java 类库。
可以将一个 JSON 字符串转成一个 Java 对象,或者反过来。
• 快速、高效
• 代码量少、简洁
• 面向对象
• 数据传递和解析方便
基本用法:
• 定义实体类
• 根据需要可以将JSON 生成单个实体或列表实体集合
代码演示:
使用 Gson 解析 JsonObject
使用 Gson 解析 JsonArray
使用 Gson 将实体转为JSON 数据
FastJson 简介和特点:
FastJson 是一个性能很好的 Java 语言实现的 JSON 解析器和生成器,来自阿里巴巴的工程师开发。
具有极快的性能,超越任其他的Java Json parser。
• 快速FAST (比其它任何基于Java的解析器和生成器更快,包括jackson)
• 强大(支持普通JDK类包括任意Java Bean Class、 Collection、 Map、 Date或enum )
• 零依赖(没有依赖其它任何类库除了JDK)
• 支持注解、支持全类型序列化
基本用法:
• 定义实体类
• 根据需要可以将JSON 生成单个实体或列表实体集合
代码演示:
使用 FastJson 解析 JsonObject
使用 FastJson 解析 JsonArray
使用 FastJson 将实体转为JSON 数据
二、实例解析
1. Gson的基本用法
Gson有两个重要的方法,一个是tojson(),另一个是
fromjson()。
tojson():将bean里面的内容转换为json内容。
User user=new User("zhangsan",19); Gson gson=new Gson(); System.out.println(gson.toJson(user)); //打印结果是{"name":"zhangsan","age":19}
当然它还可以承担一些复杂的操作,比如通过集合插入一组数据。
List<User> list = new LinkedList<User>(); User u1 =new User("zhangsan",19); list.add(u1); User u2=new User("lisi",25); list.add(u2); Gson gson = new Gson(); System.out.println(gson.toJson(list)); //打印结果是[{"name":"zhangsan","age":19},{"name":"lisi","age":25}] //注意,对于Json而言,[]代表数组,{}代表一个对象
当然它还可以实现更复杂的对象,比如在一个Json对象中再嵌套一个Json对象。
fromjson():从我们的Json对象封装出一个一个的bean对象。
User u = new User(); Gson gson = new Gson(); u = gson.fromJson("{name:'zhangsan',age:12}", user.class); System.out.println(u.getName()+" "+u.getAge()); //打印结果是zhangsan 12
如果你的Json里面不止一个对象,那么你就得使用一个集合来装.
我们这里模拟一个list来装的例子,在使用list装的过程中我们会使用到一个工具类
TypeToken.
通过它我们可以 获取一个泛型的数据类型,使用方法十分简单,
TypeToken<泛型>(){}.gettype()即可,返回一个
Type类型,这就是
fromjson()所需要的type类型,来自于
reflect包。
User user = new User(); Gson gson = new Gson(); String str = "[{name:'zhangsan',age:12},{name:'lisi',age:13}]"; // 获取一个泛型的数据类型 Type type = new TypeToken<List<user>>(){}.getType(); List<user> list = gson.fromJson(str , type); for(user u : list){ System.out.println(u.getName() + " " + u.getAge()); } //打印结果是zhangsan 12 //lisi 13
2. Gson的实例解析
下面这段 json 代码(时间不一样获得的代码可能不一样)是豆瓣书籍的一个 api :https://api.douban.com/v2/book/1220562
{ "rating": { "max": 10, "numRaters": 345, "average": "7.0", "min": 0 }, "subtitle": "", "author": [ "[日] 片山恭一" ], "pubdate": "2005-1", "tags": [ { "count": 133, "name": "片山恭一", "title": "片山恭一" }, { "count": 62, "name": "日本", "title": "日本" }, { "count": 60, "name": "日本文学", "title": "日本文学" }, { "count": 38, "name": "小说", "title": "小说" }, { "count": 32, "name": "满月之夜白鲸现", "title": "满月之夜白鲸现" }, { "count": 15, "name": "爱情", "title": "爱情" }, { "count": 8, "name": "純愛", "title": "純愛" }, { "count": 8, "name": "外国文学", "title": "外国文学" } ], "origin_title": "", "image": "https://img1.doubanio.com/mpic/s1747553.jpg", "binding": "平装", "translator": [ "豫人" ], "catalog": " ", "pages": "180", "images": { "small": "https://img1.doubanio.com/spic/s1747553.jpg", "large": "https://img1.doubanio.com/lpic/s1747553.jpg", "medium": "https://img1.doubanio.com/mpic/s1747553.jpg" }, "alt": "http://book.douban.com/subject/1220562/", "id": "1220562", "publisher": "青岛出版社", "isbn10": "7543632608", "isbn13": "9787543632608", "title": "满月之夜白鲸现", "url": "http://api.douban.com/v2/book/1220562", "alt_title": "", "author_intro": "", "summary": "那一年,是听莫扎特、钓鲈鱼和家庭破裂的一年。说到家庭破裂,母亲怪自己当初没有找到好男人,父亲则认为当时是被狐狸精迷住了眼,失常的是母亲,但出问题的是父亲……。", "price": "15.00元" }
下面我们在Android进行解析。
Project中总共有三个类:
MainActivity.java,
Book.java,
Tag.java
public class MainActivity extends Activity { private String url = "https://api.douban.com/v2/book/1220562"; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); getData(); } private void getData() { StringRequest request = new StringRequest(url, new Listener<String>() { @Override public void onResponse(String arg0) { Log.i("info", arg0); dealData(arg0); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError arg0) { // TODO Auto-generated method stub } }); // 将请求加入队列 new Volley().newRequestQueue(getApplicationContext()).add(request); } private void dealData(String result) { Gson gson = new Gson(); Book book = gson.fromJson(result, Book.class); Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":" + book.getTags().size()); // 这里打印了tags的个数 } } // Log日志结果是 满月之夜白鲸现:青岛出版社:8
// 对象的变量名要与json中的相对应,这里只是选取了json中的几个“变量”进行解析 public class Book { private String title; private String publisher; private String summary; private ArrayList<Tag> tags; public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } public String getPublisher() { return publisher; } public void setPublisher(String publisher) { this.publisher = publisher; } public String getSummary() { return summary; } public void setSummary(String summary) { this.summary = summary; } public ArrayList<Tag> getTags() { return tags; } public void setTags(ArrayList<Tag> tags) { this.tags = tags; } }
public class Tag { private String count; private String name; private String title; public String getCount() { return count; } public void setCount(String count) { this.count = count; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getTitle() { return title; } public void setTitle(String title) { this.title = title; } }
3. FastJson的基本用法
1) Fastjson中的经常调用的方法// 把JSON文本parse为JSONObject或者JSONArray public static final Object parse(String text); // 把JSON文本parse成JSONObject public static final JSONObject parseObject(String text); // 把JSON文本parse为JavaBean public static final T parseObject(String text, Class clazz); // 把JSON文本parse成JSONArray public static final JSONArray parseArray(String text); //把JSON文本parse成JavaBean集合 public static final List parseArray(String text, Class clazz); // 将JavaBean序列化为JSON文本 public static final String toJSONString(Object object); // 将JavaBean序列化为带格式的JSON文本 public static final String toJSONString(Object object, boolean prettyFormat); // 将JavaBean转换为JSONObject或者JSONArray。 public static final Object toJSON(Object javaObject);
2) 如何使用FastJson
服务器端使用Fastjson将数据转换成json字符串
主要使用的函数如下:
public static String createJsonString(Object value) { String alibabaJson = JSON.toJSONString(value);//此处转换 return alibabaJson; }
客户端将从服务器端获取到的json字符串转换为相应的javaBean,
下面给以写核心的函数例子,供参考:
public static String getJsonContent(String urlStr) { try { // 获取HttpURLConnection连接对象 URL url = new URL(urlStr); HttpURLConnection httpConn = (HttpURLConnection) url .openConnection(); // 设置连接属性 httpConn.setConnectTimeout(3000); httpConn.setDoInput(true); httpConn.setRequestMethod("GET"); // 获取相应码 int respCode = httpConn.getResponseCode(); if (respCode == 200) { return ConvertStream2Json(httpConn.getInputStream()); } } catch (IOException e) { e.printStackTrace(); } return ""; } private static String ConvertStream2Json(InputStream inputStream) throws IOException { String jsonStr = ""; // ByteArrayOutputStream相当于内存输出流 ByteArrayOutputStream out = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; // 将输入流转移到内存输出流中 while ((len = inputStream.read(buffer, 0, buffer.length)) != -1) { out.write(buffer, 0, len); } // 将内存流转换为字符串 jsonStr = new String(out.toByteArray()); return jsonStr; }
3) 使用泛型获取javaBean(核心函数)
public static T getPerson(String jsonString, Class cls) { T t = null; t = JSON.parseObject(jsonString, cls); return t; } public static List getPersons(String jsonString, Class cls) { List list = new ArrayList(); list = JSON.parseArray(jsonString, cls); return list; }
4. FastJson的实例解析
只需在“Gson的实例解析中”修改dealData(String result)方法即可。
private void dealData(String result) { Book book = JSON.parseObject(result, Book.class); List<Book> books = JSON.parseObject(result, new TypeReference<List<Book>>() { }); Book book1 = new Book(); book1.setTitle("biaoti"); Book book2 = new Book(); book2.setTitle("biaoti"); Book book3 = new Book(); book2.setTitle("biaoti"); List<Book> list = new ArrayList<Book>(); list.add(book1); list.add(book2); list.add(book3); JSON.toJSON(list); Log.i("info", book.getTitle() + ":" + book.getPublisher() + ":" + book.getTags().size()); }
三、Gson的知识点补充
1. toJson()方法
toJson()方法用于将Java对象转换为相应的JSON数据,主要有以下几种形式:
(1)String toJson(JsonElement jsonElement); (2)String toJson(Object src); (3)String toJson(Object src, Type typeOfSrc);
其中,方法(1)用于将JsonElement对象(可以是JsonObject、JsonArray等)转换成JSON数据;
方法(2)用于将指定的Object对象序列化成相应的JSON数据;
方法(3)用于将指定的Object对象(可以包括泛型类型)序列化成相应的JSON数据。
2. fromJson()方法
fromJson()方法用于将JSON数据转换为相应的Java对象,主要有以下几种形式:
(1)<T> T fromJson(JsonElement json, Class<T> classOfT); (2)<T> T fromJson(JsonElement json, Type typeOfT); (3)<T> T fromJson(JsonReader reader, Type typeOfT); (4)<T> T fromJson(Reader reader, Class<T> classOfT); (5)<T> T fromJson(Reader reader, Type typeOfT); (6)<T> T fromJson(String json, Class<T> classOfT); (7)<T> T fromJson(String json, Type typeOfT);
以上的方法用于将不同形式的JSON数据解析成Java对象。
相关文章推荐
- cardview 报了一个 android.view.InflateException: Binary XML file line # 异常
- Android发展历史
- Android shape 的属性 和 用法
- Android 用代码获取基站号(cell)和小区号(lac)
- Android利用反射获取状态栏(StatusBar)高度
- 【转】Android源代码查看途径
- Android获取手机屏幕宽高、状态栏高度以及字符串宽高信息的方法
- Android开发之有效获取状态栏(StatusBar)高度
- Android 如何判断一个应用在运行
- android简单动画
- android MotionEvent中getX()和getRawX()的区别
- Android--数据库升级,插入新字段
- 【android】LayoutInflater 观察
- Android之SurfaceView使用总结
- Android Tween动画 (渐变、缩放、位移、旋转)
- Android学习路线指南
- Android全局变量的定义与使用
- Android自定义ViewGroup工具类ViewDragHelper分析
- Android使用binder访问service的方式(一)
- Android Service GetSystemService