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

Android解析JSON数据几种方式对比

2016-08-15 16:50 585 查看
Json介绍


Json(JavaScript Object Natotion)是一种轻量级的数据交换格式,具有良好的可读性和便于快速编写的特性,主要用于传送数据。Json是一种取代Xml的数据结构,相比于xml更小巧,从而减少数据传输流量和占用的带宽。

Json语法

{ } 表示对象

[ ] 表示数组

" " 表示值或属性

:   表示前面是key后面是value,value可以是字符串、数字或者另一个数组或对象

举个例子 {"name":"tom"},表示属性名为name,值是tom。[ {"name":"tom"}, {"name":"jack"}] 这个表示2个对象的数组,等价于{"name":["tom","jack"]}这是一个拥有name数组的对象。

传统方式(使用org.json包)


  下面给出生成json字符串和解析json字符串的方法。

 

/**
* 将对象转换成json数据
* @param user
* @return
*/
public static String buildJson(User user) {
try {
JSONObject juser = new JSONObject();
juser.put("name", user.getName());
juser.put("pwd",user.getPwd());
return juser.toString();
}catch (JSONException e) {
Log.e("JSON_ERROR",e.getMessage());
}
return null;
}

/**
* 将json数据转换成对象
* @param json
* @return
*/
public static User getUser(String json) {
JSONTokener jsonTokener = new JSONTokener(json);
try {
JSONObject user = (JSONObject) jsonTokener.nextValue();
if (user != null) {
String name = user.getString("name");
String pwd = user.getString("pwd");
return new User(name,pwd);
}
}catch (JSONException e){
Log.e("JSON_ERROR",e.getMessage());
}
return null;
}

/**
* 将json数据转换成User集合
* @param key
* @param json
* @return
*/
public static List<User> getUsers(String key,String json) {
List<User> list = new ArrayList<User>();
try {
JSONObject jsonObject = new JSONObject(json);
if (jsonObject != null) {
JSONArray array = jsonObject.getJSONArray(key);
if (array != null && array.length() > 0 ) {
for (int i = 0; i < array.length(); i ++) {
JSONObject userJson = array.getJSONObject(i);
User  user = new User();
user.setName(userJson.getString("name"));
user.setPwd(userJson.getString("pwd"));
list.add(user);
}
}
return list;
}
}catch (JSONException e) {
Log.e("JSON_ERROR",e.getMessage());
}
return null;
}

org.json包提供了5个类,分别为JSONArray,JSONObject,JSONStringer,JSONTokener和JSONException。

JSONException
异常类

JSONStringer
有序构造

JSONObject
无序构造

JSONArray                   数组对象

JSONStringer传入的键值对是有序的,JSONObject传入的键值对是无序的,一般情况下使用JSONObject即可,但对于一些嵌套的Json以及一些JSONArray没有key只有value的情况,则使用JSONStringer。

使用类库Gson

<span style="font-size:18px;font-weight: bold;"> </span><span style="font-size:14px;"> /**
* 使用Gson框架将对象转换成String
* @param user
* @return
*/
public static String getJson(User user) {
Gson gson = new Gson();
return gson.toJson(user);
}

/**
* 使用Gson将String转换成对象
* @param json
* @return
*/
public static User getUser(String json) {
Gson gson = new Gson();
try {
return gson.fromJson(json,User.class);
}catch (Exception e) {
Log.e("TAG",e.getMessage());
}
return null;
}

/**
* 使用Gson将String转换成对象集合
* @param json
* @return
*/
public static List<User> getUsers(String json) {
Gson gson = new Gson();
try {
return gson.fromJson(json, new TypeToken<List<User>>(){}.getType());
}catch (Exception e) {
e.printStackTrace();
}
return null;
}</span>
类似Gson的json库常用的有Gson外还有Jackson和FastJson,对于这三个性能的对比网上众说纷纭,当然这跟他们实现的代码有很大的关系,不过个人测试后发现Jackson和FastJson的序列化和反序列化性能相当。Gson性能相比弱一些,但是很稳定。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息