人丑话不多:

直接上代码:

1.根据返回的json数据格式定义数据模型

import java.util.List;//定义一个描述天气的类
public class WeatherForecastInfo {private Double pm25;private List<Forecast> mForecasts;public Double getPm25() {return pm25;}public void setPm25(Double pm25) {this.pm25 = pm25;}public List<Forecast> getmForecasts() {return mForecasts;}public void setmForecasts(List<Forecast> mForecasts) {this.mForecasts = mForecasts;}@Overridepublic String toString() {return "天气信息[" +"pm25=" + pm25 +", mForecasts=" + mForecasts +']';}//定义一个内部类public static class Forecast{private String date;//时间private String high;//最高温private String low;//最低温private String fx;//风向private String fl;//风等级private String type;//天气类型private String notice;//温馨提示public String getDate() {return date;}public void setDate(String date) {this.date = date;}public String getHigh() {return high;}public void setHigh(String high) {this.high = high;}public String getLow() {return low;}public void setLow(String low) {this.low = low;}public String getFx() {return fx;}public void setFx(String fx) {this.fx = fx;}public String getFl() {return fl;}public void setFl(String fl) {this.fl = fl;}public String getType() {return type;}public void setType(String type) {this.type = type;}public String getNotice() {return notice;}public void setNotice(String notice) {this.notice = notice;}//重写toString方法@Overridepublic String toString() {return "未来天气[" +"日期='" + date + '\'' +", 最高温='" + high + '\'' +", 最低温='" + low + '\'' +", 风向='" + fx + '\'' +", 风等级='" + fl + '\'' +", 天气类型='" + type + '\'' +", 温馨提示='" + notice + '\'' +']';}}}

2.编写Java代码进行json数据获取和解析

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;import java.io.BufferedWriter;
import java.io.ByteArrayOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.List;public class NetWorkActivity extends AppCompatActivity{private Button btn_getData;private Button btn_parseData;private TextView tv_result;private String result;//创建一个WeatherForecastInfo对象WeatherForecastInfo weatherForecastInfo=new WeatherForecastInfo();//创建一个Forecast集合List<WeatherForecastInfo.Forecast> forecastList=new ArrayList<>();@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_network);//初始化控件initialView();//添加事件监听myClickListener();}//初始化控件public void initialView(){btn_getData=findViewById(R.id.btn_getData);btn_parseData=findViewById(R.id.btn_parseData);tv_result=findViewById(R.id.tv_result);}class MyOnClickListener implements View.OnClickListener{@Overridepublic void onClick(View view) {switch (view.getId()){case R.id.btn_getData://获取天气的jason数据//1.耗时操作必须放在线程中执行,否则报异常//2.有网络请求的,必须在开启网络权限new Thread(new Runnable() {@Overridepublic void run() {requestDataByGet();}}).start();break;case R.id.btn_parseData://解析天气的jason数据handleJsonData(result);showWeatherInfo(forecastList);break;}}}//json数据解析private void handleJsonData(String result){//创建一个json对象,捕获异常try {JSONObject jsonObject=new JSONObject(result);//提取日期String date=jsonObject.getString("date");System.out.println("date:"+date);//提取城市String city=jsonObject.getString("city");System.out.println("city:"+city);//提取data数据JSONObject dataObject=jsonObject.getJSONObject("data");//提取data里面的pm25double pm25=dataObject.getDouble("pm25");weatherForecastInfo.setPm25(pm25);//提取data里面的未来天气//注意:forecast中的内容带有中括号[],所以要转化为JSONArray类型的对象JSONArray forecasts=dataObject.getJSONArray("forecast");//对forecast数组判空if (forecasts!=null&&forecasts.length()>0){//for循环来处理for (int index=0;index<forecasts.length();index++){//提取出forecast中每个数组中的内容JSONObject weather=forecasts.getJSONObject(index);String mdate=weather.getString("date");//时间String mhigh=weather.getString("high");//最高温String mlow=weather.getString("low");//最低温String mfx=weather.getString("fx");//风向String mfl=weather.getString("fl");//风等级String mtype=weather.getString("type");//天气类型String mnotice=weather.getString("notice");//温馨提示//创建WeatherForecastInfo中的内部类ForecastWeatherForecastInfo.Forecast forecastItem=new WeatherForecastInfo.Forecast();//设置Forecast中的数据forecastItem.setDate(mdate);forecastItem.setHigh(mhigh);forecastItem.setLow(mlow);forecastItem.setFx(mfx);forecastItem.setFl(mfl);forecastItem.setType(mtype);forecastItem.setNotice(mnotice);//最后将forecastItem添加到forecastList集合中forecastList.add(forecastItem);}weatherForecastInfo.setmForecasts(forecastList);}tv_result.setText(weatherForecastInfo.toString());}catch (JSONException e){e.printStackTrace();}}//显示天气数据public void showWeatherInfo(List<WeatherForecastInfo.Forecast> forecastList){//将forecastList列表中的数据循环输出if (forecastList!=null){System.out.println(forecastList.toString());}}//get方法获取json的天气数据private void requestDataByGet() {try {String citiName="北京";String weather_url="https://www.sojson.com/open/api/weather/json.shtml?city="+getEncodeValue(citiName);URL url=new URL(weather_url);HttpURLConnection connection=(HttpURLConnection) url.openConnection();connection.setConnectTimeout(30*1000);connection.setRequestMethod("GET");connection.setRequestProperty("Content-Type","application/json");connection.setRequestProperty("Charset","UTF-8");connection.setRequestProperty("Accept-Charset","UTF-8");connection.connect();//发起连接//获取状态码int requestCode=connection.getResponseCode();System.out.println(requestCode);//获取返回信息String requestMessage=connection.getResponseMessage();System.out.println(requestMessage);//根据状态码进行处理if (requestCode==HttpURLConnection.HTTP_OK){//1.从connection中获得输入流InputStream inputStream=connection.getInputStream();//2.将输入流转换成字符串result=streamToString(inputStream);//3.更新UI必须在主线程中完成runOnUiThread(new Runnable() {@Overridepublic void run() {tv_result.setText(result);}});}else {Log.e("TAG", "run:error code: "+requestCode+",message:"+requestMessage);}}catch (MalformedURLException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}}//post方法/*private void requestDataByPost() {try {URL url=new URL("https://www.sojson.com/open/api/weather/json.shtml");HttpURLConnection connection=(HttpURLConnection) url.openConnection();connection.setConnectTimeout(30*1000);connection.setRequestMethod("Post");connection.setRequestProperty("Content-Type","application/json");connection.setRequestProperty("Charset","UTF-8");connection.setRequestProperty("Accept-Charset","UTF-8");connection.setDoOutput(true);connection.setDoInput(true);//是否使用缓存connection.setUseCaches(false);connection.connect();//发起连接String data="city="+getEncodeValue("北京");OutputStream outputStream=connection.getOutputStream();outputStream.write(data.getBytes());outputStream.flush();//最后关闭输入流outputStream.close();//获取状态码int requestCode=connection.getResponseCode();//获取返回信息String requestMessage=connection.getResponseMessage();//根据状态码进行处理if (requestCode==HttpURLConnection.HTTP_OK){//从connection中获得输入流InputStream inputStream=connection.getInputStream();//将输入流转换成字符串result=streamToString(inputStream);//3.更新UI必须在主线程中完成runOnUiThread(new Runnable() {@Overridepublic void run() {tv_result.setText(result);}});}else {Log.e("TAG", "run:error code: "+requestCode+",message:"+requestMessage);}}catch (MalformedURLException e){e.printStackTrace();}catch (IOException e){e.printStackTrace();}}
*///将编码转换成UTF编码public String getEncodeValue(String imooc){String encode=null;try {encode= URLEncoder.encode(imooc,"UTF-8");}catch (UnsupportedEncodingException e){e.printStackTrace();}return encode;}public void myClickListener(){MyOnClickListener myOnClickListener=new MyOnClickListener();btn_getData.setOnClickListener(myOnClickListener);btn_parseData.setOnClickListener(myOnClickListener);}//将输入流转换成字符串public String streamToString(InputStream inputStream){try{ByteArrayOutputStream baos=new ByteArrayOutputStream();byte[] buffer=new byte[1024];int len;while ((len=inputStream.read(buffer))!=-1){//byte数组、偏移量、数组长度baos.write(buffer,0,len);}//关闭输出流baos.close();//关闭输入流inputStream.close();//将输出流转换成字节数组byte[] byteArray=baos.toByteArray();//将字节数组转换成字符串,并进行返回return new String(byteArray);}catch (Exception e){Log.e("TAG",e.toString());return null;}}
}

运行情况:

09-17 11:34:05.830 3910-3910/com.example.jiaho.http I/System.out: date:20180917city:北京
09-17 11:34:05.834 3910-3910/com.example.jiaho.http I/System.out: [未来天气[日期='17日星期一', 最高温='高温 27.0℃', 最低温='低温 17.0℃', 风向='北风', 风等级='<3级', 天气类型='多云', 温馨提示='阴晴之间,谨防紫外线侵扰'], 未来天气[日期='18日星期二', 最高温='高温 25.0℃', 最低温='低温 17.0℃', 风向='西南风', 风等级='<3级', 天气类型='阴', 温馨提示='不要被阴云遮挡住好心情'], 未来天气[日期='19日星期三', 最高温='高温 26.0℃', 最低温='低温 19.0℃', 风向='南风', 风等级='<3级', 天气类型='多云', 温馨提示='阴晴之间,谨防紫外线侵扰'], 未来天气[日期='20日星期四', 最高温='高温 29.0℃', 最低温='低温 16.0℃', 风向='西北风', 风等级='<3级', 天气类型='多云', 温馨提示='阴晴之间,谨防紫外线侵扰'], 未来天气[日期='21日星期五', 最高温='高温 24.0℃', 最低温='低温 12.0℃', 风向='西风', 风等级='4-5级', 天气类型='晴', 温馨提示='愿你拥有比阳光明媚的心情']]

java调用天气API和JSON解析的那些事儿相关推荐

  1. Java调用 新浪微博API 接口发微博(包含js微博组件、springMVC新浪登录)详解

    参考自:http://www.myexception.cn/program/1930025.html https://blog.csdn.net/qq_36580777/article/details ...

  2. 天气查询调用天气API

    # 天气查询调用天气API # #天气API地址 #HOST='https://yiketianqi.com' import requests from xiangmu2.configs.tianqi ...

  3. Java调用百度API实现图像识别

    Java调用百度API实现图像识别 最近在做一个关于识别的小功能,翻阅了一堆资料,也实践自己去实现这个功能,最后识别的结果不是那么理想.这里介绍一个完全可以商用以及识别率超高的百度ai接口 1.为什么 ...

  4. Java调用百度API生成短网址

    由于百度短网址旧API更新,故更新下原博客内容(仅供参考),希望小伙伴们以官方API为主,以防影响使用. 官方API:https://dwz.cn/console/apidoc package com ...

  5. Java下利用Jackson进行JSON解析和序列化

    Java下利用Jackson进行JSON解析和序列化 转载于:https://www.cnblogs.com/jing1617/p/7009122.html

  6. java 调用win32 api 学习总结

    java使用JInvoke调用windows API 使用jinvoke调用windowsAPI.jna使用比较麻烦,需要写c代码和参数转换,jinvoke的使用就像jdk中的包一样. 官网使用参考: ...

  7. yesry 通过桥接器,Java调用任何API或DLL

    大家知道,Java调用DLL有个特别的地方,就是DLL的输出函数需要特别的名字: JNIEXPORT void JNICALL Java_类名_函数名   (JNIEnv *, jclass, 其他参 ...

  8. Java调用百度API出现{status:211,message:APP SN校验失败}

    Java调用百度API出现{"status":211,"message":"APP SN校验失败"} {"status" ...

  9. JAVA 调用微信API 生成小程序跳转地址 亲测有效 【附效果图】

    JAVA 调用微信API 生成小程序跳转地址 JAVA 调用微信API 生成小程序跳转地址 由于工作需要,需要在后台生成自己公司的小程序分享地址以供前端工作人员使用,在开发当前功能时因为遇到一些问题导 ...

最新文章

  1. oracle 表列 自增,ORACLE表建立自增列
  2. SSH框架整合-慕课课程
  3. The conversion of a varchar data type to a datetime data type resulted in an out-of-range value
  4. 36)PHP,搜寻数据库信息在html中显示(晋级1)
  5. 测试人员在需求阶段应做哪些工作
  6. shell脚本详解(十二)——Here Document免交互及Expect自动化交互
  7. java图像处理之幂律变换
  8. 158. class, static, self, parent
  9. 乘法逆元(ex_gcd和同余定理)
  10. Grails Quartz插件,定时调度任务
  11. 软考初级程序员案例分析必考考点解析:
  12. 用PS快速给图片添加逼真彩虹效果
  13. 好用到爆!IDEA 版 Postman 面世了,功能真心强大
  14. Get UWP Version(不使用额外的nuget包或SDK)
  15. 用python对CSV文件中的数据进行统计分析
  16. 小说怎样在百度引流,小说项目怎么盈利?
  17. 【Matlab】自定义函数的几种方法
  18. win7系统的电脑怎么提升开机速度
  19. 学术资源不定期分享-【费曼物理学讲义英文原版】
  20. ECMAScript 6 入门(阮一峰)个人总结

热门文章

  1. 《手把手教你美股开户——Sogotrade为例(二)》http://xueqiu.com/4474116166/28363545 《手把手教你美股开户——Sog...
  2. windows curl 之 invalid character ‘\‘‘ looking for beginning of value
  3. As Beginning
  4. [附源码]SSM计算机毕业设计japm青篮汇篮球培训系统JAVA
  5. 问道手游安卓服务器维护公告,问道手游安卓服务器5月24日6时维护公告
  6. 全球及中国丝素行业研究及十四五规划分析报告
  7. D3DERR内容详细翻译
  8. 无mac电脑无苹果开发者账号生成苹果ios证书的方法
  9. 学习笔记(05):自然语言处理Word2Vec视频学习教程-影评情感分类任务概述
  10. Python selenium自动化操作Chrome浏览器