Android 数据之Json解析

    Json格式数据和xml数据是软件开发中常见的数据存储类型,它们在前后端交数据的交互上提供了便捷的方式,既可以将对象转换成json也可以将文件,数组,集合转换为json,通过流的方式发送给客户端。
    Json解析分为Gson解析和android的自带的解析API,这篇文章我们讨论Android的自带的Json解析方式的用法。

Json数据准备
这里我在网络上找到了一个天气预报的接口,提供的是json数据,网址:http://wthrcdn.etouch.cn/weather_mini?citykey=101010100,这里的citykey=101010100,为北京市,这里我只是做JSon解析,就不探讨其他城市的key值了,这里我们打开网站会看到显示如下:
这里写图片描述乱码!!!什么也看不懂。
但是,我们可以看出它是属于一个json数据格式的,这就需要我们将获取的数据进行编码转换,转换成UTF-8编码就可以了。
Json数据的处理
这里贴出我写的一些代码,把网络请求放到一个独立的线程中去完成。

thread = new Thread(){
    public void run(){
    try {
            //初始化URl
            URL url = new URL("http://wthrcdn.etouch.cn/weather_mini?citykey=101010100");
            //打开链接
            URLConnection connection = url.openConnection();
            //读入流数据
            InputStream is = connection.getInputStream();
            //设置缓冲
            BufferedInputStream bis = new BufferedInputStream(is);
            //设置输出流
            ByteArrayOutputStream outStream = new ByteArrayOutputStream(); 
            byte[] buff = new byte[512];
            int read = 0;
            while((read = bis.read(buff)) != -1){
                outStream.write(buff,0,read);
            }
            byte[] data = outStream.toByteArray();//网页的二进制数据  
            outStream.flush();
            outStream.close();
            bis.close();
            is.close();
            str = new String(data,"utf-8");//格式转换
            Message message = new Message();
            message.what =0x001;
            hander.sendMessage(message);
            } catch (MalformedURLException e) {
            Message message = new Message();
            message.what =0x002;
            hander.sendMessage(message);
            e.printStackTrace();
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        };
    };
thread.start();

这样我们就可以获得正确的json数据了,我们可以将获得str字符串打印出来。效果是这样的:
这里写图片描述

然后我们将这些数据复制出来,将他们手动格式化一下,分析其json格式:

这里写图片描述

图片没能贴全。但大部分都贴出来了,基本的格式我们也可以看出来,这组Json数据,{}中的为JsonObject,[]中的JsonArray,我们经过这种格式化的分析时就可以很方便的将json数据解析出来了。

我们发现[]中的内容是很一致的,于是我定义了一个类对象,方便我们的数据使用。

public class Wether {
    /*
    "fengxiang":"北风",
    "fengli":"5-6级",
    "high":"高温 24℃",
    "type":"晴",
    "low":"低温 11℃",
    "date":"3日星期六"
 */
    private String fengxiang;
    private String fengli;
    private String high;
    private String type;
    private String low;
    private String date;
    private String city;
    public Wether() {
    }

    public Wether(String fengxiang, String fengli, String high, String type, String low, String date, String city) {
        super();
        this.fengxiang = fengxiang;
        this.fengli = fengli;
        this.high = high;
        this.type = type;
        this.low = low;
        this.date = date;
        this.city = city;
    }
    //省略了get和set方法!!!!
}

Json数据的解析
我准备了一个JsonTool的类,在里面写了两个处理数据的方法:
我们将{}中的数据用JsonObject进行解析:

JSONObject rootObject = new JSONObject(str);
JSONObject object = (JSONObject) rootObject.get("data");

然后我们就可以获得data里面的json数据了,由于data里面的forecast是一组数组形式的数据我们用JsonArray进行解析转换成数组;

JSONArray array = (JSONArray) object.get("forecast");

然后我们利用循环将数据解析并进行存储这里用了Arraylist集合对象

String city = object.getString("city");
for (int i = 0; i < array.length(); ++i) {
                /*
                    "fengxiang":"北风",
                    "fengli":"5-6级",
                    "high":"高温 24℃",
                    "type":"晴",
                    "low":"低温 11℃",
                    "date":"3日星期六"
                 */
JSONObject o = (JSONObject) array.get(i);
o.getString("high"),
o.getString("type"),    
o.getString("low"),
o.getString("date"),
city));}

data里面还有一个yesterday的json对象,我们将他单独解析出来,放到list后面。

JSONObject yDayObject = (JSONObject) object.get("yesterday");
wethers.add(new Wether(yDayObject.getString("fx"),    yDayObject.getString("fl"),                           yDayObject.getString("high"), 
yDayObject.getString("type"),           
yDayObject.getString("low"), 
yDayObject.getString("date"),
city)
);

这样我们的json数据就解析成功了。

另外我有定义了一个类将其他的一些额外信息进行解析;

public String[] dealAnotherJson(String str){
        String[] strs = new String[4];
        try {
            JSONObject rootObject = new JSONObject(str);
            JSONObject object = (JSONObject) rootObject.get("data");
            strs[0] = object.getString("wendu");
            strs[1] = object.getString("ganmao");
            strs[2] = object.getString("aqi");
            strs[3] = object.getString("city");
        } catch (JSONException e) {
            e.printStackTrace();
            System.out.println("初始化解析JSON失败");
        }
        return strs;
    }

这样整个数据都解析完成了。
下面就让我们看看在手机上显示的如何吧:
这里写图片描述
当然你也可以找到自己城市的key,设置自己城市的天气情况,并美化UI界面。
总结:

  1. 先分析得到的json数据,将其格式化后在确定解析的方法
  2. 在{}中的均为Json对象,直接用JsonObject进行解析,在[]中的为json数组,就用JsonArray进行转换成数组。
  3. 尽量找出共同点,建立类对象进行存储数据,和数据的迁移。
  4. 只要我们调理清楚,再麻烦的json数据也是可以经过一步一步的拆分而解决的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值