本文将会以从聚合网获得数据为例,介绍如何在Android Studio中获取JSON并解析

这里做一个简单的天气查询的应用

文章目录

  • 1. 准备工作--导入依赖
  • 2. 核心代码部分
    • 2.1 Get方式的http请求
    • 2.2 写出查询函数,包含解析
    • 2.3 写好显示内容的textView和button
  • 5. 添加权限
  • 6. 最后一点小问题
  • 7. 运行结果

1. 准备工作–导入依赖

JSON解析这里会用到net.sf.json.JSONObject
正常的Android studio会报错,这里需要导入几个jar包
一般情况下,去搜索json-lib-2.4-jdk15.jar就可以找到跟它相关的所有包,如下:

接下来导入app->libs中

这里面会有包跟默认的冲突,所以需要手动删除这个文件:
commons-beanutils -> org -> apache -> commons 下的collections文件夹

2. 核心代码部分

2.1 Get方式的http请求

在开始写代码之前,需要先获取聚合网的API_KEY

这里与http连接,和JSON解析,都参考了聚合网的查询接口

 // 天气情况查询接口地址public static String API_URL = "http://apis.juhe.cn/simpleWeather/query";// 接口请求Key,这里需要输入自己的API_KEYpublic static String API_KEY = "xxxxxxxxxxxxxx";/*** get方式的http请求** @param httpUrl 请求地址* @return 返回结果*/public static String doGet(String httpUrl, String queryParams) {HttpURLConnection connection = null;InputStream inputStream = null;BufferedReader bufferedReader = null;String result = null;// 返回结果字符串try {// 创建远程url连接对象URL url = new URL(new StringBuffer(httpUrl).append("?").append(queryParams).toString());// 通过远程url连接对象打开一个连接,强转成httpURLConnection类connection = (HttpURLConnection) url.openConnection();// 设置连接方式:getconnection.setRequestMethod("GET");// 设置连接主机服务器的超时时间:15000毫秒connection.setConnectTimeout(5000);// 设置读取远程返回的数据时间:60000毫秒connection.setReadTimeout(6000);// 发送请求connection.connect();// 通过connection连接,获取输入流if (connection.getResponseCode() == 200) {inputStream = connection.getInputStream();// 封装输入流,并指定字符集bufferedReader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));// 存放数据StringBuilder sbf = new StringBuilder();String temp;while ((temp = bufferedReader.readLine()) != null) {sbf.append(temp);sbf.append(System.getProperty("line.separator"));}result = sbf.toString();}} catch (IOException e) {e.printStackTrace();} finally {// 关闭资源if (null != bufferedReader) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}if (null != inputStream) {try {inputStream.close();} catch (IOException e) {e.printStackTrace();}}if (connection != null) {connection.disconnect();// 关闭远程连接}}return result;}

2.2 写出查询函数,包含解析

先查询JSON返回示例:

{"reason": "查询成功","result": {"city": "苏州","realtime": {"temperature": "4","humidity": "82","info": "阴","wid": "02","direct": "西北风","power": "3级","aqi": "80"},"future": [{"date": "2019-02-22","temperature": "1/7℃","weather": "小雨转多云","wid": {"day": "07","night": "01"},"direct": "北风转西北风"},{"date": "2019-02-23","temperature": "2/11℃","weather": "多云转阴","wid": {"day": "01","night": "02"},"direct": "北风转东北风"},{"date": "2019-02-24","temperature": "6/12℃","weather": "多云","wid": {"day": "01","night": "01"},"direct": "东北风转北风"},{"date": "2019-02-25","temperature": "5/12℃","weather": "小雨转多云","wid": {"day": "07","night": "01"},"direct": "东北风"},{"date": "2019-02-26","temperature": "5/11℃","weather": "多云转小雨","wid": {"day": "01","night": "07"},"direct": "东北风"}]},"error_code": 0
}

JAVA代码:

/*** 根据城市名查询天气情况** @param cityName*/public static void queryWeather(String cityName) {Map<String, Object> params = new HashMap<>();//组合参数params.put("city", cityName);params.put("key", API_KEY);String queryParams = urlencode(params);String response = doGet(API_URL, queryParams);try {JSONObject jsonObject = JSONObject.fromObject(response);int error_code = jsonObject.getInt("error_code");if (error_code == 0) {System.out.println("调用接口成功");JSONObject result = jsonObject.getJSONObject("result");JSONObject realtime = result.getJSONObject("realtime");rcvString="";rcvString+=("\n城市:"+ result.getString("city"));rcvString+=("\n天气:"+ realtime.getString("info"));rcvString+=("\n温度:" +realtime.getString("temperature"));rcvString+=("\n湿度:"+ realtime.getString("humidity"));rcvString+=("\n风向:"+ realtime.getString("direct"));rcvString+=("\n风力:"+ realtime.getString("power"));rcvString+=("\n空气质量:"+ realtime.getString("aqi"));} else {Log.d("调用接口失败:" , jsonObject.getString("reason"));}} catch (Exception e) {e.printStackTrace();}}
/*** 将map型转为请求参数型** @param data* @return*/public static String urlencode(Map<String, ?> data) {StringBuilder sb = new StringBuilder();for (Map.Entry<String, ?> i : data.entrySet()) {try {sb.append(i.getKey()).append("=").append(URLEncoder.encode(i.getValue() + "", "UTF-8")).append("&");} catch (UnsupportedEncodingException e) {e.printStackTrace();}}String result = sb.toString();result = result.substring(0, result.lastIndexOf("&"));return result;}

2.3 写好显示内容的textView和button

 TextView textView,inputText;Button msgBtn;public static String rcvString = "";textView = findViewById(R.id.textView);msgBtn = findViewById(R.id.button);inputText = findViewById(R.id.editTextTextPersonName);msgBtn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {String cityName = inputText.getText().toString();queryWeather(cityName);textView.setText(rcvString);}});

5. 添加权限

在AndroidManifest.xml文件中添加:

<uses-permission android:name="android.permission.INTERNET"></uses-permission>

android:usesCleartextTraffic="true"

6. 最后一点小问题

由于传输的数据量可能不小,所以需要在oncreate下面加这么一句话:

if (android.os.Build.VERSION.SDK_INT > 9) {StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();StrictMode.setThreadPolicy(policy);}

7. 运行结果

安卓开发--连接到聚合网,获取JSON数据并解析(踩了好多好多坑)相关推荐

  1. android通过json获取图片,Android-okhttp获取json数据及解析

    Okhttp简介 okhttp是目前android开发中比较流行的一个开源网络请求框架,相比于官网api提供的网络接口有很多优点. android6.0以前,官方sdk提供的是httpUrlConne ...

  2. android客户端从服务器端获取json数据并解析的实现代码

    2019独角兽企业重金招聘Python工程师标准>>> 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 代码如下: /** * 从指定的URL中获取 ...

  3. 一个简单的Android客户端从服务器端获取json数据并解析的实现代码

    今天总结一下android客户端从服务器端获取json数据的实现代码,需要的朋友可以参考下 首先客户端从服务器端获取json数据 1.利用HttpUrlConnection 复制代码代码如下: /** ...

  4. 利用百度APIStoreSDK获取Json数据并解析加载到ListView上

    效果图(这里只是截取了List中的一项): 一.:登录百度ApiStore,获取移动sdk Android版(同时有使用文档和示例),将jar包导入到项目中 Android Studio请在放入lib ...

  5. 网络获取json数据并解析

    1.升级流程分析 2.Android通过URL获取网络资源 JSONObject来解析Json字符串 //创建URL对象//本机地址用localhost, 但是如果用模拟器加载本机的地址时,可以用ip ...

  6. java中的数据解析是_Java从网络中请求获取JSon数据以及解析JSON数据----(自创,请注明)...

    Json数据是比较常用的数据类型解析,优点就不多说啦.来看看方法: public static JSONObject getJsonObject(String url) { JSONObject js ...

  7. java 获取json的值_Java如何获取JSON数据中的值

    场景:在接口自动化场景中,下个接口发送的请求参数,依赖上个接口请求结果中的值.需要将获取值作为全局参数引用. import java.io.File; import java.io.FileInput ...

  8. java $.getjson_JQuery 获取json数据$.getJSON方法的实例代码

    jQuery系列 第八章 jQuery框架Ajax模块 第八章 jQuery框架Ajax模块 8.1 jQuery框架中的Ajax简介 Ajax技术的核心是XMLHTTPRequest对象,该对象是A ...

  9. datagrid php json,thinkphp和easyui结合中,datagrid等容器获取json数据的方法

    一直使用两者进行前后台开发,非常方便,但在datagrid中获取json数据并显示的时候碰到了问题,网上资料非常的少,基本都是jsp和php的,thinkphp框架的就没有了,可能非常简单,但本人刚学 ...

最新文章

  1. IBM被曝拟出售昔日明星业务Watson Health,10年医疗梦就此破碎?
  2. MAC Opencv include选择
  3. centerpoint 项目
  4. 点云网络的论文理解(一)-点云网络的提出 PointNet : Deep Learning on Point Sets for 3D Classification and Segmentation
  5. Kafka入门经典教程【转】
  6. PHP递归创建多级目录(一道面试题的解题过程)
  7. NodeJs学习笔记002--npm常用命令详解
  8. HDU1418 抱歉【数学】
  9. python语言的读法-python是什么语言编写的
  10. 计算机装机比赛感想,装机赛 篇一:一次雨露均沾的装机比赛
  11. php mysql 微博系统_基于校网学堂的校园微博系统设计与实现(PHP,MySQL)(含录像)
  12. 语音合成IC与语音IC的两三事
  13. 阿里巴巴国际站关键词的收集
  14. 阿里云盘来了,百度网盘VS阿里云盘,你更看好谁!
  15. 赫尔维兹_勒奇超越函数(matlab自编函数)
  16. 一位女测试工程师的成长
  17. OAUS自动升级系统
  18. 基于特征匹配的英文印刷字符识别代码自己的注释
  19. C++中运行一个程序的内存分配情况及qt中的内存管理机制
  20. loaded the xxx nib but the view outlet was not set 错误的解决办法。

热门文章

  1. 404 html代码,不懂代码,如何制作漂亮的404页面【新手简易教程】
  2. The connection for the USB device '###' was unsuccessful. The device is currently in use
  3. 机器学习不会解决自然语言理解(NLU)问题
  4. 让你的LCD1602显示用户自定义字符 Arduino-LiquidCrystal库的createChart()介绍
  5. LintCode Url Parser
  6. 兰卡斯特大学 计算机,兰卡斯特大学计算机科学与信息系统Computer Science and Information Systems世界排名2020年最新排名第151-200位(QS世界排名)...
  7. NEG+SBB指令组合的用处
  8. 敖夜肝了这份Scrapyd核心源码剖析及爬虫项目实战部署
  9. 把机顶盒刷成Linux操作系统
  10. 【Unity】Rigibody——刚体加力、刚体加扭矩力、刚体加力的几种模式