Android解析数据—JSON格式数据

1.前言

        上一篇文章向大家介绍了XML数据的解析,那么接下来我们要去学习如何解析JSON格式的数据,相对于XML,JSON的主要优势在于它的体积更小,在网络上传输的时候可以更省流量。但缺点在于,它的语义性较差,看起来不如XML直观。

2.数据分析

        (1)JSON格式
JSON(JavaScript Object Notation)与XML格式相比较是一种轻量级的数据交换格式,JSON采用兼容性很高,完全独立于语言文本格式,可以在不同的平台之间进行数据交换。JSON数据格式比较简单,易于读写,格式都是压缩的,在传输的过程中占用带宽小并且它还支持多种语言,便于服务端和客户端的解析同时因为JSON格式能够直接为服务器端代码使用,大大简化了服务端和客户端的代码并且易于维护。

JSON数据分为两种结构:

name-value 键值对构成的集合,类似于Java中的Map

value的有序列表,类似于Java中的Array


3.实现方法

         解析JSON数据也有很多种方法,可以使用官方提供的JSONObject,也可以使用谷歌的开源库GSON。除此之外还有一些第三方开源库如Jackson,FastJSON等可以用来解析JSON,


要进行解析的json文件如下

{
  "rt": {
    "tid": "20140318155513001",
    "warehouseid": "47a7377d4a9e42e3a665af0894946e21",
    "rc": "0000",
    "rm": "成功",
    "tasks": {
      "task": [
        {
          "name": "102",
          "refercode": "150303101458414",
          "status": "3"
        },
        {
          "name": "119",
          "refercode": "20150303-6",
          "status": "3"
        },
        {
          "name": "202",
          "refercode": "150307125515568",
          "status": "3"
        },
        {
          "name": "107",
          "refercode": "150303140159283",
          "status": "3"
        }
      ]
    }
  }
}


(1)使用JSONObject

(1.1)首先,上面的JSON格式的字符串整个都在一对大括号当中,那么我们把这一对大括号里面的全部内容看做是一个JSONObject对象,这时我们需要通过JSONObject json = new JSONObject(strResult)来获取这个JSONObject对象,其中strResult就是那个大括号里的全部内容的字符串

(1.2)在大括号中你肯定会注意到最外层里面有“tid”,“warehouseid”,“rc”,“rm”等数据,如果要读取“tid”中的数据可以使用String tid = json.getString(tid)来获取,至于warehouseid,rc,rm中的值的获取方法以此类推

(1.3)在往下看我们会发现task的值是一个数组,这是因为JSON中中括号就是数组的标志,如果要读取这个数组可以使用JSONArray array = json.getJSONArray("task"),这是你会发现在task数组中有若干个大括号分别包含着不通的内容,那么每个大括号所包含的内容就是这个数组的一个元素,其中数组中的每个元素都是JSONObject的对象,通过JSONObject task = array.getJSONObject(i)来获取

(1.4)此时,你又会发现在task数组中的每一个元素中都有“name”,“refercode”,“status”等数据,那么就可以使用String task = json.getString(name)来获取

(1.5)现在对于最基本的JSON已经介绍完毕了,其实不管是对JSON数组的读取还是对普通对象的读取本质上没有大的区别,在进行JSONObject解析的过程中只需要记住一对大括号就是一个JSONObject对象,一对中括号就是一个JSONArray数组。一对大括号即一个JSONObject对象中可包含多个普通键值对、JSONObject对象和JSONArray数组,一对中括号即一个JSONArray数组中也可以包含多个普通键值对、JSONObject对象和JSONArray数组


需要定义一个Goods类

package com.example.administrator.jsonparser;

/**
 * Created by ChuPeng on 2016/10/10.
 */
public class Goods
{
    private String name;
    private String refercode;
    private String status;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getRefercode()
    {
        return refercode;
    }
    public void setRefercode(String refercode)
    {
        this.refercode = refercode;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
}

解析数据的主要代码如下

package com.example.administrator.jsonparser;

import org.json.JSONArray;
import org.json.JSONObject;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by ChuPeng on 2016/10/10.
 */
public class ParserJSONWithJSONObject
{

    public static List<Goods> getJsonContentForJSONObject(String json)
    {
        List<Goods> goodsList = new ArrayList<Goods>();
        try
        {
            JSONObject jsonObject = new JSONObject(json);
            String rt = jsonObject.getString("rt");
            JSONObject jsonObjectRt = new JSONObject(rt);
            String tasks = jsonObjectRt.getString("tasks");
            JSONObject jsonObjectTasks = new JSONObject(tasks);
            String task = jsonObjectTasks.getString("task");
            JSONArray jsonArray = new JSONArray(task);
            for(int i = 0; i < jsonArray.length(); i++)
            {
                Goods goods = new Goods();
                JSONObject jsonObjectTask = jsonArray.getJSONObject(i);
                goods.setName(jsonObjectTask.getString("name"));
                goods.setRefercode(jsonObjectTask.getString("refercode"));
                goods.setStatus(jsonObjectTask.getString("status"));
                goodsList.add(goods);
            }
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return goodsList;
    }
}


(2)使用GSON

如果你觉得上面使用JSONObject来解析JSON数据已经非常简单,那么接下来给大家介绍使用GSON来解析JSON数据的的方法,这种方法会简单到让你想象不到的地步。首先我们要使用这个功能就必须在项目中添加一个GSON的Jar包,下载地址为:http://code.google.com/p/google-gson/downloads/list

在我们下载好之后需要进行解压,我们会看到如下的几个文件


其中gson-2.2.4.jar这个文件就是我们需要的,我们需要把这个文件复制到所要使用项目的libs目录下,如下图所示


对于GSON的使用主要有两种:一种是将对象或者不同的内容转化为JSON格式(使用toJson()方法),另一种是将JSON格式的内容还原到相应的对象属性或者其它属性(使用fromJson()方法)

(2.1)将内容转化为JSON格式的数据(使用toJson()方法)

首先,使用Gson gson = new Gson()去创建gson对象

其次,要把内容转化为JSON格式时,需要新建一个JavaBean类并且进行初始化

最后,使用String str = gson.toJson(p)//p为JavaBean类的对象   进行解析

(2.2)将JSON格式的数据转化为内容(使用fromJson()方法)

fromJson()方法的神奇之处就在于可以将一段JSON格式的字符串自动映射成一个对象,从而不需要我们再手动去编写代码进行解析

如果一段JSON格式的数据如下所示

{"rc": "0000","rm": "成功"}

此时我们需要定义个Result类,并且加入rc和rm字段,然后进行简单的调用如下代码就可以利用GSON将JSON数据解析成为一个Result

Result的类定义为

public class Result 
{
	private String rm;
	private String rc;
	public String getRm() 
	{
		return rm;
	}
	public void setRm(String rm) 
	{
		this.rm = rm;
	}
	public String getRc() 
	{
		return rc;
	}
	public void setRc(String rc) 
	{
		this.rc = rc;
	}
}

Gson gson = new Gson();

String json = "{"rc": "0000","rm": "成功"}";

Result result = gson.fromJson(json, Result.class);


以上是解析JSON字符串的方法,当我们要解析的是JSON字符串数组时,一般有两种方式:使用数组和使用List。因为使用List对于增删改查都比较方便,所以在实际应用的过程中还是使用List的情况比较多。

如果一段JSON字符串数组的数据如下所示

["Android","IOS","Windows Phone","Symbian","Black Berry"]


使用数组的方式:

Gson gson = new Gson();

String json = "["Android","IOS","Windows Phone","Symbian","Black Berry"]";

String[] strings = gson.fromJson(json,String[].class);


使用List的方式:

对于以上的代码直接将String[].class改为List<String>.class是行不通的,在这里使用Java泛型的时候要注意泛型擦除的问题。为了解决这个问题,Gson为我们提供了TypeToken来实现对泛型的支持,所以当我们希望使用将以上的数据解析为List<String>时需要这样写


Gson gson = new Gson();

String json = "["Android","IOS","Windows Phone","Symbian","Black Berry"]";

List<String> stringList = gson.fromJson(json, new TypeToken<List<String>>(){}.getType());

注意:TypeToken的构造方法是protected修饰的,所以上面才会写成new TypeToken<List<String>>() {}.getType() 而不是 new TypeToken<List<String>>().getType()


需要定义一个Goods类

package com.example.administrator.jsonparser;

/**
 * Created by ChuPeng on 2016/10/10.
 */
public class Goods
{
    private String name;
    private String refercode;
    private String status;
    public String getName()
    {
        return name;
    }
    public void setName(String name)
    {
        this.name = name;
    }
    public String getRefercode()
    {
        return refercode;
    }
    public void setRefercode(String refercode)
    {
        this.refercode = refercode;
    }
    public String getStatus()
    {
        return status;
    }
    public void setStatus(String status)
    {
        this.status = status;
    }
}

使用GSON解析上面json文件的主要代码

JSONObject jsonObject = new JSONObject(json);
String rt = jsonObject.getString("rt");
JSONObject jsonObjectRt = new JSONObject(rt);
String tasks = jsonObjectRt.getString("tasks");
JSONObject jsonObjectTasks = new JSONObject(tasks);
String task = jsonObjectTasks.getString("task");
gson = new Gson();
goodsList = gson.fromJson(task, new TypeToken<List<Goods>>(){}.getType());

4.总结

通过以上两种方法的讲解相信你现在一定可以灵活的解析JSON格式的数据了,总之,还是那句话—适合自己的才是最好的,大家要按自己的需求选择解析的方法。


以上Demo的源代码地址:点击打开链接



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值