文档章节

Android 数据之Json解析

YH_猿员猿
 YH_猿员猿
发布于 2016/07/21 17:32
字数 1169
阅读 12
收藏 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学习之JSON数据解析

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

wustrive_2008
2011/06/30
0
0
开发自己的监控系统三、移动篇(android)

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

cszer
2013/06/09
0
1
使用curl 和 libjson 完成联网和数据解析

项目就要做到联网了, 选择了用curl库来完成联网部分,网上看了下curl使用,要是简单的联下网,测测数据什么的,还是挺简单的,但要用到游戏里面,那就有必要进一步的封装了。 由于C++这块还...

cocosgame
2012/08/06
0
1
Json解析速度比较-Android API、Gson、Fastjson

IOS现成的API里的json解析速度非常快,这里就不说了,今天对比一下Android里面json的解析库。 首先第一个是Android API里面自带的json解析,其次是谷歌提供的Gson解析库(开源),其次是在网...

未来程序员
06/29
0
0

没有更多内容

加载失败,请刷新页面

加载更多

jdk 1.8 在线文档

https://docs.oracle.com/javase/8/docs/api/

kuchawyz
10分钟前
1
0
python:有个叫strip的东西.....

strip.....脱.......呃,这个嘛,好吧,也许python的开发团队并不忌讳strip这个词的意思[] lstrip() >>> b' spacious '.lstrip()b'spacious '>>> b'www.example.com'.lstrip(b'cmowz......

Oh_really
23分钟前
0
0
Rails 用现代 Rails 逃离单页面应用 “兔子洞”

在工作共总是觉得turbolinks非常爽,但是却总是被说成是过时的技术,大家都喜欢spa,哪怕不用的spa的人也是禁用掉的多,找不到很好的理由劝说别人使用,这篇文章说的很到位,或者说至少是牛人...

wmzsonic
43分钟前
0
0
Hive 分布式搭建,Spark集成Hive记录

本帖详细介绍搭建步骤,仅仅记录自己搭建过程以及采坑经历。 前提环境: Hadoop集群 版本2.7.2 Spark集群 版本2.1.0 Linux版本 Centos7 准备搭建 MySql版本5.5.61 ,Hive-2.1.0 去官网下载M...

我爱春天的毛毛雨
46分钟前
3
0
打包QML程序

1、windeployqt执行路径(D:\Qt\5.12.0\msvc2017_64\bin)加入到PATH中 2、使用Qt自带的命令行交互 Command 终端(Qt 5.12.0 64-bit for Desktop (MSVC 2017))切换到 Release 编译成功的exe...

渣渣曦
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部