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

Android开发之JSON数据解析和生成

2014-11-30 21:51 495 查看
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于JavaScript(Standard ECMA-262 3rd Edition - December 1999)的一个子集。
JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C, C++, C#, Java, JavaScript, Perl, Python等)。这些特性使JSON成为理想的数据交换语言。易于人阅读和编写,同时也易于机器解析和生成(网络传输速度快)(转至百度百科)。

在Android开发中JSON数据的解析和生成非常的常见。先上今天的JSON例子吧

{
"id": "1",
"orderTable": "5",
"orderCount": "1",
"totalCost": "245",
"totalCount":"5",
"time": "2014-05-19日01:01:01",
"complete":"false",
"orderMenuItems": [
{
"id": "1",
"menuId": "1",
"menuName": "川菜酸菜鱼",
"money": "49.0",
"menuCount": "1",
"style": "",
"complete": "false"
},
{
"id": "2",
"menuId": "2",
"menuName": "川菜红烧鱼",
"money": "49.0",
"menuCount": "4",
"style": "",
"complete": "false"
}
]
}


和之前的XML一样,以上面的json数据为基础,开始进行解析和生成。
1、用org.json.JSONObject包的解析器进行解析。参考以下代码

 <span style="font-family: Arial, Helvetica, sans-serif;">JSONObject obj = new JSONObject(json);(这个json字符串就是需要解析的数据)</span>
JSONArray array = obj.getJSONArray("orderMenuItems");
int id = obj.getInt("id");
int orderTable = obj.getInt("orderTable");
int orderCount = obj.getInt("orderCount");
double totalCost = obj.getDouble("totalCost");
String time = obj.getString("time");
boolean complete = obj.getBoolean("complete");

for (int i = 0; i < array.length(); i++) {
JSONObject objs = array.getJSONObject(i);
int _id = objs.getInt("id");
// "id": "1",
int menuId = objs.getInt("menuId");
// "menuId": "1",
String menuName = objs.getString("menuName");
// "menuName": "川菜酸菜鱼",
double money = objs.getDouble("money");
// "money": "49.0",
int menuCount = objs.getInt("menuCount");
// "menuCount": "1",
String style = objs.getString("style");
// "style": "",
boolean completes = objs.getBoolean("complete");
// "complete": "false"
}


2、以上代码可以万全的解析出来需要的JSON数据。但是,当JSON数据量大的时候,我们不可能这样去一行一行的写代码去解析。那么,我们需要用到第三方的JSON解析JAR包。这里博主介绍谷歌提供的GSONjar包。

用GSON解析的时候,我们需要和之前XML文件一样,将需要的解析的数据定义成为一个类。在定义类的时候,我们需要注意,当整个JSON数据里面包含数组的时候,我们需要将这个数组里面的数据从新定义成一个类。请参考一下代码,这是根据今天的JSONS数据定义出来的两个类。第一个为Order,第二个为JSON数组里面包含数据的类OrderItem.
Order类

import java.util.List;

/**
* @ClassName: Order
* @author victor_freedom (x_freedom_reddevil@126.com)
* @createddate 2014年11月30日 下午6:20:10
* @Description: TODO
*
*/
public class Order {
private int id;
private int orderCount;
private int orderTable;
private double totalCost;
private int totalCount;
private String time;
private boolean complete;
private List<OrderItem> orderMenuItems;

public Order() {
};

public Order(int id, int orderCount, int orderTable, double totalCost,
int totalCount, String time, boolean complete,
List<OrderItem> orderMenuItems) {
this.id = id;
this.orderCount = orderCount;
this.orderTable = orderTable;
this.totalCost = totalCost;
this.totalCount = totalCount;
this.time = time;
this.complete = complete;
this.orderMenuItems = orderMenuItems;

}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public int getOrderTable() {
return orderTable;
}

public void setOrderTable(int orderTable) {
this.orderTable = orderTable;
}

public double getTotalCost() {
return totalCost;
}

public void setTotalCost(double totalCost) {
this.totalCost = totalCost;
}

public int getTotalCount() {
return totalCount;
}

public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}

public String getTime() {
return time;
}

public void setTime(String time) {
this.time = time;
}

public boolean isComplete() {
return complete;
}

public void setComplete(boolean complete) {
this.complete = complete;
}

public List<OrderItem> getOrderMenuItems() {
return orderMenuItems;
}

public void setOrderMenuItems(List<OrderItem> orderMenuItems) {
this.orderMenuItems = orderMenuItems;
}

public String toString() {

return "id:" + id + "-" + "orderCount:" + orderCount + "-"
+ "orderTable:" + orderTable + "-" + "totalCost" + totalCost
+ "-" + "totalCount:" + totalCount + "-" + "time:" + time + "-"
+ "complete:" + complete;

}

}


OrderItem类

/**
* @ClassName: OrderItem
* @author victor_freedom (x_freedom_reddevil@126.com)
* @createddate 2014年11月30日 下午6:24:52
* @Description: TODO
*
*/
public class OrderItem {
private int id;
private int menuId;
private String menuName;
private double money;
private int menuCount;
private String style;
private boolean complete;

public OrderItem() {
};

public OrderItem(int id, int menuId, String menuName, double money,
int menuCount, String style, boolean complete) {
this.id = id;
this.menuId = menuId;
this.menuName = menuName;
this.money = money;
this.menuCount = menuCount;
this.style = style;
this.complete = complete;

}

public int getId() {
return id;
}

public void setId(int id) {
this.id = id;
}

public int getMenuId() {
return menuId;
}

public void setMenuId(int menuId) {
this.menuId = menuId;
}

public String getMenuName() {
return menuName;
}

public void setMenuName(String menuName) {
this.menuName = menuName;
}

public double getMoney() {
return money;
}

public void setMoney(double money) {
this.money = money;
}

public int getMenuCount() {
return menuCount;
}

public void setMenuCount(int menuCount) {
this.menuCount = menuCount;
}

public String getStyle() {
return style;
}

public void setStyle(String style) {
this.style = style;
}

public boolean isComplete() {
return complete;
}

public void setComplete(boolean complete) {
this.complete = complete;
}

}


那么有了这两个类之后,在用GSON去解析我们的JSON数据,步骤就非常方便了,首先将GSON做成一个工具类,参考代码如下:

import com.google.gson.Gson;

public class GsonUtils {

//将JSON数据解析生成指定的类
public static <T> T jsonToBean(String jsonResult, Class<T> clz) {
Gson gson = new Gson();
T t = gson.fromJson(jsonResult, clz);
return t;
}

//将一个javaBean生成对应的Json数据
public static String beanToJson(Object obj) {
Gson gson = new Gson();
String json = gson.toJson(obj);
return json;
}

}


有了该工具类在解析今天的数据并生成对应的bean实例,参考代码如下:

Order orderjson = GsonUtils.jsonToBean(json, Order.class);
Log.i("json", orderjson.toString());
就这么一行代码就OK了。日志里面打印出来的是对应的内容。这里需要特别注意的是运用GSON解析JSON数据,定义的类的字段名必须和Json数据中的key值一样。

那么,JSON的解析就讲完了,在讲讲如何去生成对应的JSON数据。生成JSON数据去XML文件一样,也可以自己一个一个去拼接,当然,正常人都不会这么做。刚刚的GSON工具类的第二个方法,就是用来生成对应JSON数据的,非常的简单。首先生成对应的bean实例,然后传给GSON就可以了,参考代码如下:

OrderItem item1 = new OrderItem(1, 1, "川菜酸菜鱼", 49.0, 1, "加辣", false);
OrderItem item2 = new OrderItem(2, 2, "川菜红烧鱼", 58.0, 4, "加辣", false);
List<OrderItem> orderMenuItems = new ArrayList<OrderItem>();
orderMenuItems.add(item1);
orderMenuItems.add(item2);
Order order = new Order(1, 1, 5, 245, 1, "2014-05-19日01:01:01", false,
orderMenuItems);
String json = GsonUtils.beanToJson(order);
Log.i("json", json);


日志打印出来的内容和上面贴出来的json数据例子是一致的,可能顺序会有点不同而已。

至此Android开发中常用的两种数据JSON和XML的解析和生成都已经讲解完毕,希望会帮到看到此文章的同学们。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: