JSON解析之——Android
JSON解析之——Android
一、google天气案例
之前xml学习中的google天气的例子非常形象,所以我们继续以google天气作为案例进行学习,下面是我从google官网下载下来的天气Json文件,可以看出,和xml的格式区别非常大。
{ "coord":{"lon":121.46,"lat":31.22},
"weather":[{
"id":721,
"main":"Haze",
"description":"haze",
"icon":"50d"}],
"base":"stations",
"main":
{"temp":282.15,
"pressure":1024,
"humidity":82,
"temp_min":282.15,
"temp_max":282.15},
"visibility":4500,
"wind":{"speed":5,"deg":310},
"clouds":{"all":44},
"dt":1450060200,
"sys":{
"type":1,
"id":7452,
"message":0.0142,
"country":"CN",
"sunrise":1450046656,
"sunset":1450083169},
"id":1796236,
"name":"Shanghai",
"cod":200
}
我们需要的数据有:城市 最低温度 最高温度 湿度 风向
于是我们建立一个CurrentWeatherJson类来存储需要的数据。
package org.xerrard.xmlpulldemo;
public class CurrentWeatherJson {
public String city; //城市
public String temperature_min; // 温度
public String temperature_max; // 温度
public String humidity; // 湿度
public String wind_direction; // 风向
public String toString()
{
//摄氏度(℃)=K-273。
float temperatureMin = Float.parseFloat(temperature_min)-272.15f;
float temperatureMax = Float.parseFloat(temperature_max)-272.15f;
StringBuilder sb = new StringBuilder();
sb.append(" 城市: ").append(city);
sb.append(" 最低温度: ").append(temperatureMin + "").append(" °C");
sb.append(" 最高温度: ").append(temperatureMax + "").append(" °C");
sb.append(" 湿度 ").append(humidity);
sb.append(" 风向 ").append(wind_direction);
return sb.toString();
}
}
然后我们建立一个数据模型来封装Json数据的解析,在WeatherJsonModel中,我们可以将Json中我们需要的数据解析出来,存储到CurrentWeatherJson对象中
package org.xerrard.xmlpulldemo; import org.json.JSONException;
import org.json.JSONObject;
import org.json.JSONTokener; public class WeatherJsonModel { public static CurrentWeatherJson getData(String json){
JSONTokener jsonParser = new JSONTokener(json);
JSONObject weather;
try {
weather = (JSONObject) jsonParser.nextValue();
if(weather.length()>0){
CurrentWeatherJson curCondition = new CurrentWeatherJson();
curCondition.city = weather.getString("name");
curCondition.humidity = weather.getJSONObject("main").getInt("humidity") + "";
curCondition.temperature_max = weather.getJSONObject("main").getInt("temp_max") + "";
curCondition.temperature_min = weather.getJSONObject("main").getInt("temp_min") + "";
curCondition.wind_direction = weather.getJSONObject("wind").getInt("deg") + "";
}
}
catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return curCondition; } }
最后,我们可以使用WeatherJsonModel来进行解析数据,并得到我们需要的数据
File jsonFlie = new File(Environment.getExternalStorageDirectory().getPath() + "/" +"weather.json");
CharBuffer cbuf = null;
FileReader fReader;
try {
fReader = new FileReader(jsonFlie);
cbuf = CharBuffer.allocate((int) jsonFlie.length());
fReader.read(cbuf);
String text = new String(cbuf.array());
TextView hello = (TextView)findViewById(R.id.hello);
hello.setText(WeatherJsonModel.getData(text).toString());
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
二、android中JSON提供的几个比较重要的类
android的json解析部分都在包org.json下,主要有以下几个类:
JSONObject:可以看作是一个json对象,这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。它对外部(External: 应用toString()方法输出的数值)调用的响应体现为一个标准的字符串(例如:{"JSON": "Hello, World"},最外被大括号包裹,其中的Key和Value被冒号":"分隔)。其对于内部(Internal)行为的操作格式略微,例如:初始化一个JSONObject实例,引用内部的put()方法添加数值:new JSONObject().put("JSON", "Hello, World!"),在Key和Value之间是以逗号","分隔。Value的类型包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object 。
JSONStringer:json文本构建类 ,根据官方的解释,这个类可以帮助快速和便捷的创建JSON text。其最大的优点在于可以减少由于 格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。。其最大的优点在于可以减少由于格式的错误导致程序异常,引用这个类可以自动严格按照JSON语法规则(syntax rules)创建JSON text。每个JSONStringer实体只能对应创建一个JSON text。
JSONArray:它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如: [value1,value2,value3],大家可以亲自利用简短的代码更加直观的了解其格式)。这个类的内部同样具有查询行为, get()和opt()两种方法都可以通过index索引返回指定的数值,put()方法用来添加或者替换数值。同样这个类的value类型可以包括:Boolean、JSONArray、JSONObject、Number、String或者默认值JSONObject.NULL object。
JSONTokener:json解析类
JSONException:json中用到的异常
三、对于复杂的JSON数据的解析,google提供了Gson来处理。
参考资料:
google weather api : http://openweathermap.org/current
http://blog.csdn.net/onlyonecoder/article/details/8490924 android JSON解析详解
JSON解析之——Android的更多相关文章
- android json解析及简单例子
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- [Android]天气App 3 网络数据的请求和Json解析
Android客户端开发,不仅仅是在Android端开发,还需要有相应的后台服务支持,否则的话,客户端的数据就只能放到本地自己做处理.我认为的原生态的App就是对应服务端的Client.他能像浏览 ...
- android Json解析详解
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语 言的支持),从而可以在不同平台间进行数 ...
- android Json解析详解(详细代码)
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- 【转】android json解析及简单例子
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- jsonObject jsonArray jsonTokener jsonStringer,json解析以及http请求获取josn数据并加以解析
JSON的定义: 一 种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的 支持),从而可以在不同平台间进行 ...
- Android okHttp网络请求之Json解析
前言: 前面两篇文章介绍了基于okHttp的post.get请求,以及文件的上传下载,今天主要介绍一下如何和Json解析一起使用?如何才能提高开发效率? okHttp相关文章地址: Android o ...
- Android之JSON解析
做个Android网络编程的同学一定对于JSON解析一点都不陌生,因为现在我们通过手机向服务器请求资源,服务器给我们返回的数据资源一般都是以JSON格式返回,当然还有一些通过XML格式返回,相对JSO ...
- android JSON解析之JSONObject与GSON
1.写在前面 JSON数据是android网络开发中常见的数据格式,JSON最常见的传输方法是使用HTTP协议,关于android开发中HTTP协议的使用方法可参考我的另一篇随笔android网络编程 ...
随机推荐
- Webpack 傻瓜式指南(一)
modules with dependencies webpack module bundler static assetss .js .js .png Webpack傻瓜式指南 n ...
- cf B Very Beautiful Number
题意:给你两个数p和x,然后让你找出一个长度为p的数,把它的最后移到最前面之后得到的数是原来数字的x倍,有很多这样的数取最小. 思路:枚举最后一位,然后就可以推出整个的一个数,然后比较得到的数的第一个 ...
- TWinControl的刷新过程(5个非虚函数,4个覆盖函数,1个消息函数,默认没有双缓冲,注意区分是TCustomControl还是Windows原生封装控件,执行流程不一样)
前提条件:要明白在TWinControl有以下四个函数的存在,注意都是虚函数: procedure Invalidate; override;procedure Update; override;pr ...
- 利用js制作html table分页示例(js实现分页)
有时候table的列数太长,不利于使用者查询,所以利用JS做了一个table的分页,以下为相关代码 一.JS代码 <script type="text/javascript" ...
- java学习之数组(一)【内存】
在java语言当中,为了更方便多个数据的管理,这里提供数组. 比如说,现在我们有一组数据,7,8,9,9,为了保存这四个数据,我们分别要定义变量来保存,少了还好说.但是假如,有100多个数据呢,我们一 ...
- 【宽搜】ECNA 2015 E Squawk Virus (Codeforces GYM 100825)
题目链接: http://codeforces.com/gym/100825 题目大意: N个点M条无向边,(N<=100,M<=N(N-1)/2),起始感染源S,时间T(T<10) ...
- voronoi
- python 代码格式化工具:autopep8
学习资料: https://github.com/hhatto/autopep8 背景 autopep8 会根据 PEP 8 样式文档来格式化 python 代码.它使用 pep8 来决定代码的哪部分 ...
- the identity used to sign the executable is no longer valid.解决方法
the identity used to sign the executable is no longer valid.解决方法 一.重新下载Provisioning Profile 1.到devel ...
- 关于连不上dc服务器的机器强行退出域的方法
有时加入域的计算机无法连接到之前的域了,只能强制退出域了,有两个前提条件: 1.断开网络,就是拔掉网线或者禁用网卡. 2.使用本地管理员登陆. 然后命令行执行如下命令即可: netdo ...