您的位置:首页 > 移动开发 > Android开发

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对象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: