文档章节

Android 数据之Json解析

YH_猿员猿
 YH_猿员猿
发布于 2016/07/21 17:32
字数 1169
阅读 15
收藏 0
    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数据也是可以经过一步一步的拆分而解决的。

本文转载自:http://blog.csdn.net/yin569258/article/details/50895783

共有 人打赏支持
YH_猿员猿
粉丝 0
博文 12
码字总数 0
作品 0
徐汇
程序员
私信 提问
android客户端访问服务端tomcat

首先,服务器端已经存在一个项目,该项目基于SSH,已经部署在tomcat上并且正在运行了.我在这个项目的action层新建了一个包,该包主要是Struts2的一些action,只是这些action不是返回某些view,而是...

蜡笔小小小新
2015/11/11
0
0
在 Android 应用程序中使用 Internet 数据(XML,JSON,Protocol Bu

Android 应用程序必须访问位于 Internet 上的数据,而 Internet 数据可以有几种不同的格式。本文将介绍在 Android 应用程序中如何使用三种数据格式: XML JSON Google 的 protocol buffers 首...

红薯
2010/08/08
3.8K
4
Android学习之JSON数据解析

在Android应用开发中,常用的数据交换格式有XML和JSON,这两种方式各有各的好处,我们在特定的应用开发中可以选择合适的一种。下面来看一下JOSN数据解析: 例子永远是最好的教程,下面我们来...

wustrive_2008
2011/06/30
0
0
Android四款系统架构工具

Spring for Android   Spring for Android是Spring框架在Android平台上的扩展,旨在简化Android原生应用的开发流程,提高开发者的工作效率。Spring for Android可以帮助开发者简化应用与服...

zhwj407906450
2014/10/21
0
0
开发自己的监控系统三、移动篇(android)

开发自己的监控系统一、email篇 开发自己的监控系统二、web篇 移动篇(android) 关键字:java、android、json、php 互联网已经进入大数据时代,如果没有给自己的产品开发手机端的应用程序,...

cszer
2013/06/09
0
1

没有更多内容

加载失败,请刷新页面

加载更多

多表查询

第1章 多表关系实战 1.1 实战1:省和市  方案1:多张表,一对多  方案2:一张表,自关联一对多 1.2 实战2:用户和角色 (比如演员和扮演人物)  多对多关系 1.3 实战3:角色和权限 (比如...

stars永恒
今天
6
0
求推广,德邦快递坑人!!!!

完全没想好怎么来吐槽自己这次苦逼的德邦物流过程了,只好来记一个流水账。 从寄快递开始: 2019年1月15日从 德邦物流 微信小app上下单,截图如下: 可笑的是什么,我预约的是17号上门收件,...

o0无忧亦无怖
昨天
6
0
Mac Vim配置

1.升级 vim   我自己 MacBook Pro 的系统还是 10.11 ,其自带的 vim 版本为 7.3 ,我们将其升至最新版: 使用 homebrew : brew install vim --with-lua --with-override-system-vim 这将下...

Pasenger
昨天
8
0
vmware安装Ubuntu上不了网?上网了安装不了net-tools,无法执行ifconfig?

1.重新设置网络适配器还是不行,如下指定nat 2.还需要指定共享网络,我是在无线环境下 3.无法执行ifconfig https://packages.ubuntu.com/bionic/net-tools到这个网站下载net-tools的deb文件...

noob_chr
昨天
4
0
解决SVN:E210007无法协商认证机制

svn:E210007 svn: Cannot negotiate authentication mechanism 执行下面代码即可 sudo yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-ldap...

临江仙卜算子
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部