android 空气质量代码,Android-Json数据解析之空气质量检测
一、JSON基础
1.JSON优点:格式简单,占宽带小,多语言支持
2.JSON缺点:编码必须是Unicode,语法过于严谨
但也因为JSON语法严谨(如四大基础规则),才能支持多语言
3.JSON四大基础规则:
(1)并列数据之间用逗号隔开(",");
(2)映射用冒号表示(":");
(3)并列数据集合集合(数组)用"[]"表示;
(4)映射的集合(对象)"{}"表示;
二、空气质量检测app开发
1.开发环境:
Android Studio 2.1.2(API:18~24)
jdk1.8.0_91
2.工程开发:
(1)搭建工程
这里写图片描述
(2)空气质量检测API数据申请
申请api和key请上网站(https://www.juhe.cn/docs/api/id/33), 申请完之后数据将以JSON的格式返回,而读者要做的就是请求数据和解析数据,就是这么简单。
这里写图片描述
返回的数据我只是解析了其中的两个,读者可以根据自己需要解析更多的数据
(3)返回的JSON格式数据
{
"resultcode": "200",
"reason": "SUCCESSED!",
"error_code": 0,
"result": [
{
"citynow": {
"city": "suzhou",
"AQI": "77",
"quality": "良",
"date": "2014-05-09 14:00"
},
"lastTwoWeeks": {
"1": {
"city": "suzhou",
"AQI": "100",
"quality": "良",
"date": "2014-05-08"
},
"2": {
"city": "suzhou",
"AQI": "99",
"quality": "良",
"date": "2014-05-07"
},
"3": {
"city": "suzhou",
"AQI": "77",
"quality": "良",
"date": "2014-05-06"
},
"4": {
"city": "suzhou",
"AQI": "75",
"quality": "良",
"date": "2014-05-05"
},
"5": {
"city": "suzhou",
"AQI": "78",
"quality": "良",
"date": "2014-05-04"
},
"6": {
"city": "suzhou",
"AQI": "84",
"quality": "良",
"date": "2014-05-03"
},
"7": {
"city": "suzhou",
"AQI": "135",
"quality": "轻度污染",
"date": "2014-05-02"
},
"8": {
"city": "suzhou",
"AQI": "126",
"quality": "轻度污染",
"date": "2014-05-01"
},
"9": {
"city": "suzhou",
"AQI": "87",
"quality": "良",
"date": "2014-04-30"
},
"10": {
"city": "suzhou",
"AQI": "97",
"quality": "良",
"date": "2014-04-29"
},
"11": {
"city": "suzhou",
"AQI": "77",
"quality": "良",
"date": "2014-04-28"
},
"12": {
"city": "suzhou",
"AQI": "84",
"quality": "良",
"date": "2014-04-27"
},
"13": {
"city": "suzhou",
"AQI": "45",
"quality": "优",
"date": "2014-04-26"
},
"14": {
"city": "suzhou",
"AQI": "56",
"quality": "良",
"date": "2014-04-25"
},
"15": {
"city": "suzhou",
"AQI": "83",
"quality": "良",
"date": "2014-04-24"
},
"16": {
"city": "suzhou",
"AQI": "95",
"quality": "良",
"date": "2014-04-23"
},
"17": {
"city": "suzhou",
"AQI": "101",
"quality": "轻度污染",
"date": "2014-04-22"
}
},
"lastMoniData": {
"1": {
"city": "上方山",
"AQI": "77",
"quality": "良",
"PM2.5Hour": "46μg/m³",
"PM2.5Day": "46μg/m³",
"PM10Hour": "104μg/m³",
"lat": "31.247222",
"lon": "120.561389"
},
"2": {
"city": "南门",
"AQI": "112",
"quality": "轻度污染",
"PM2.5Hour": "84μg/m³",
"PM2.5Day": "84μg/m³",
"PM10Hour": "—μg/m³",
"lat": "31.286389",
"lon": "120.6275"
},
"3": {
"city": "彩香",
"AQI": "76",
"quality": "良",
"PM2.5Hour": "46μg/m³",
"PM2.5Day": "46μg/m³",
"PM10Hour": "101μg/m³",
"lat": "31.301944",
"lon": "120.590833"
},
"4": {
"city": "轧钢厂",
"AQI": "68",
"quality": "良",
"PM2.5Hour": "41μg/m³",
"PM2.5Day": "41μg/m³",
"PM10Hour": "85μg/m³",
"lat": "31.326389",
"lon": "120.595556"
},
"5": {
"city": "吴中区",
"AQI": "64",
"quality": "良",
"PM2.5Hour": "46μg/m³",
"PM2.5Day": "46μg/m³",
"PM10Hour": "—μg/m³",
"lat": "31.270278",
"lon": "120.612778"
},
"6": {
"city": "苏州新区",
"AQI": "72",
"quality": "良",
"PM2.5Hour": "46μg/m³",
"PM2.5Day": "46μg/m³",
"PM10Hour": "93μg/m³",
"lat": "31.299444",
"lon": "120.543333"
},
"7": {
"city": "苏州工业园区",
"AQI": "82",
"quality": "良",
"PM2.5Hour": "60μg/m³",
"PM2.5Day": "60μg/m³",
"PM10Hour": "88μg/m³",
"lat": "31.309722",
"lon": "120.669167"
}
}
}
]
}
读者谨记:在JSON中,"[ ]"指的是数组(集合),"{ }"指的是对象
(3)代码编写
activity_main.xml如下所示
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.administrator.whetherreporter.MainActivity">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal">
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/cityName"
android:textSize="25sp" />
android:id="@+id/cityName"
android:layout_width="297dp"
android:layout_height="wrap_content" />
android:id="@+id/submit"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="@string/submit"
android:textSize="25sp" />
android:layout_width="match_parent"
android:layout_height="match_parent">
android:id="@+id/show"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000"
android:textSize="18sp" />
界面比较丑,读者可以根据自己需要修改界面,其实认真写好界面,不失为一款好的应用
strings.xml如下所示
城市:
提交
城市
空气质量指数
空气质量
更新时间
地点
PM2.5Hour
PM2.5Day
PM10Hour
维度
经度
MainActivity.java 如下所示
package com.example.administrator.whetherreporter;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
import android.widget.Toast;
/**
* Created by Sean on 2016/8/11.
*/
public class MainActivity extends AppCompatActivity {
private EditText et_cityName;
private Button btn_submit;
private TextView tv_show;
private Task task;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
et_cityName= (EditText) findViewById(R.id.cityName);
btn_submit= (Button) findViewById(R.id.submit);
tv_show= (TextView) findViewById(R.id.show);
btn_submit.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
String cityName=et_cityName.getText().toString();
if (cityName.length()<1){
Toast.makeText(MainActivity.this,
"请输入城市的名字",Toast.LENGTH_SHORT).show();
return;
}
else {
//开启多线程,一般将比较耗时的操作交给另一条线程
task=new Task(MainActivity.this,tv_show);
task.execute(cityName);
}
}
});
}
}
Taks.java 如下所示
package com.example.administrator.whetherreporter;
import android.content.Context;
import android.os.AsyncTask;
import android.widget.TextView;
import android.widget.Toast;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.ArrayList;
/**
* Created by Sean on 2016/8/11.
*/
public class Task extends AsyncTask {
private TextView tv_show;
private Context context;
//获取的API接口
private static final String url = "http://web.juhe.cn:8080/environment/air/cityair";
//获取的API的key
private static final String key = "8118a1d36116d6e89f543163055d7530";
public Task(Context context, TextView tv_show) {
this.context = context;
this.tv_show = tv_show;
}
/***
*
* 通过API请求数据
* @param strings :从主线程中执行子线程传入的字符串,即cityName
* @return :请求API之后返回的JSON格式数据
*/
@Override
protected String doInBackground(String... strings) {
String city = strings[0];
ArrayList firstList = new ArrayList();
//设置访问文本类型
firstList.add(new BasicNameValuePair("Content-Type", "text/html,charset=utf-8"));
String targetUrl = url;
//请求的参数
ArrayList paramsList = new ArrayList();
paramsList.add(new BasicNameValuePair("city", city));
paramsList.add(new BasicNameValuePair("key", key));
for (int i = 0; i < paramsList.size(); i++) {
NameValuePair nowPair = paramsList.get(i);
String value = nowPair.getValue();
try {
value = URLEncoder.encode(value, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
if (i == 0) {
targetUrl += ("?" + nowPair.getName() + "=" + value);
} else {
targetUrl += ("&" + nowPair.getName() + "=" + value);
}
}
//以Get的形式访问
HttpGet httpGet = new HttpGet(targetUrl);
try {
for (int i = 0; i < firstList.size(); i++) {
httpGet.addHeader(firstList.get(i).getName(), firstList.get(i).getValue());
}
HttpClient httpClient = new DefaultHttpClient();
HttpResponse httpResponse = httpClient.execute(httpGet);
if (httpResponse.getStatusLine().getStatusCode()==200){
String result= EntityUtils.toString(httpResponse.getEntity());
return result;
}
else
return null;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
/***
*
* 解析返回的数据
* @param s :请求之后返回的数据
*/
@Override
protected void onPostExecute(String s) {
super.onPostExecute(s);
if (s!=null){
try {
JSONObject jsonObject=new JSONObject(s);
int resultCode=jsonObject.getInt("resultcode");
if (resultCode==200){
JSONArray resultArray=jsonObject.getJSONArray("result");
JSONObject resultJsonObject = resultArray.getJSONObject(0);
JSONObject A= (JSONObject) resultJsonObject.get("citynow");
JSONObject B= (JSONObject) resultJsonObject.get("lastMoniData");
String division="---------------------------------------------";
String output=
context.getString(R.string.city)+":"+A.optString("city")+"\n"
+context.getString(R.string.AQI)+":"+A.optString("AQI")+"\n"
+context.getString(R.string.quality)+":"+A.optString("quality")+"\n"
+context.getString(R.string.time)+":"+A.optString("date")+"\n"
+division+"\n"
+"监测点数据"+"\n";
for (int i=0;i
int w=i+1;
String n=Integer.toString(w);
JSONObject C= (JSONObject) B.get(n);
output=output
+ context.getString(R.string.loc) + ":" + C.optString("city") + "\n"
+ context.getString(R.string.AQI) + ":" + C.optString("AQI") + "\n"
+ context.getString(R.string.quality) + ":" + C.optString("quality") + "\n"
+ context.getString(R.string.PM10) + ":" + C.optString("PM10Hour") + "\n"
+ context.getString(R.string.PM2_5Hour) + ":" + C.optString("PM2.5Hour") + "\n"
+ context.getString(R.string.PM2_5Day) + ":" + C.optString("PM2.5Day") + "\n"
+ context.getString(R.string.lat) + ":" + C.optString("lat") + "\n"
+ context.getString(R.string.lon) + ":" + C.optString("lon") + "\n";
}
tv_show.setText(output);
}
else if (resultCode==202){
String reason=jsonObject.getString("reason");
tv_show.setText(reason);
}
else{
Toast.makeText(context, "查询失败",
Toast.LENGTH_LONG).show();
tv_show.setText("");
}
} catch (JSONException e) {
e.printStackTrace();
}
}
else {
Toast.makeText(context, "查询失败",
Toast.LENGTH_LONG).show();
tv_show.setText("");
}
}
}
*注意:类NameValuePair在Android API22的是后就已经过时了,可以用到类ContentValue来代替,使用方式如下图所示 *
这里写图片描述
HttpGet 和 HttpClient 需要读者自己导入第三方包
这里写图片描述
三、测试
这里写图片描述
这里写图片描述
由于API本身的局限性,所以有些地方数据可能有问题,请包涵!
That's all , 感谢您的阅读,之后我会将我的项目发布到GitHub。
android 空气质量代码,Android-Json数据解析之空气质量检测相关推荐
- Android学习笔记44:JSON数据解析
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种理想的数据交换格式. 本文将主要介绍在Android ...
- java数组里套数组_用JAVA进行Json数据解析(对象数组的相互嵌套)
这段时间我们在做一个英语翻译软件的小小小APP,涉及到了对Json数据的解析,所以特地来总结一下! 假设我们要对如下数据进行解析,其实在平时,返回的Json数据是很乱的,很难分清数据的关系,这是经过相 ...
- android客户端从服务器端获取json数据并解析的实现代码
2019独角兽企业重金招聘Python工程师标准>>> 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 代码如下: /** * 从指定的URL中获取 ...
- 一个简单的Android客户端从服务器端获取json数据并解析的实现代码
今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...
- Android JSON数据解析(GSON方式)
要创建和解析JSON数据,也可以使用GSON来完成.GSON是Google提供的用来在Java对象和JSON数据之间进行映射的Java类库.使用GSON,可以很容易的将一串JSON数据转换为一个Jav ...
- Android json数据解析及简单例子
JSON的定义: 一种轻量级的数据交换格式,具有良好的可读和便于快速编写的特性.业内主流技术为其提供了完整的解决方案(有点类似于正则表达式 ,获得了当今大部分语言的支持),从而可以在不同平台间进行数据 ...
- json数据解析 android,Android基础之json数据解析
这次来聊聊Android中json数据的解析,既然是基础就要求只要你看一遍就必须会的,不牵涉到太多的复杂逻辑,目的就是让你初步认识json数据的解析和学会对简单的json数据进行解析. 首先第一步我们 ...
- Android中Json数据解析
Android学习系列(20)--App数据格式之解析Json (很基本基础的入门,对json的基础讲的很好) http://my.eoe.cn/874311/archive/1936.html An ...
- Android系列---JSON数据解析
http://www.cnblogs.com/xiaoluo501395377/p/3446605.html Android系列---JSON数据解析 转载于:https://www.cnblogs. ...
- android studio json数据解析汇总(备忘)
之前写过一个,但是写不太全,结果自己都看不懂,希望这个以后能看懂吧. 以两个例子说明json数据解析,一个是最简单的,一个是比较难的. 必须知道的:JSONObject和JSONArray JSONO ...
最新文章
- JQUERY动态生成当前年份的前5年以及后 2年
- 小人脸检测 - Finding Tiny Faces
- Master、Slave等术语将不能在未来的Linux代码中使用
- Sublime优美设置(待续)
- Mac OS使用技巧十八:Safari碉堡功能之一制作Widget
- 【数字逻辑设计】判断二进制加法溢出的电路设计
- layui-简单辅助元素 - 页面元素
- 鼠标划过图片进行缩放效果
- 【less-2】sqli-labs靶场第二关
- html5向上向下兼容插件,Sticky Header-兼容IE8的页面顶部固定jQuery插件
- python函数定义及调用-python函数的定义和调用 | 酷python
- C++ static、const和static const 以及它们的初始化
- windows 无法停止ics_x64仿真功能加入 ARM版Windows即将获得大量的应用程序
- php项目升级包制作,PHP项目安全:PHP的安装与升级
- 一个简单的完全信息动态博弈的解答
- 开源GIS与空间数据库实战教程
- JAVA对接阿里语音识别引擎
- linux点亮硬盘locat,Linux中locate whereis which find grep5种查询命令总结
- MEGA使用VCF/Hapmap数据构建进化树
- TaefTestParser, Version=2.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35