一. 简介及资源
之前写了一篇Volley的网络请求获取数据,这篇就是接着的,使用Gson来解析数据并展示出来,希望对萌新有所帮助,
我的资源依旧免费,哈哈,只为方便。
jar包地址:链接: https://pan.baidu.com/s/18DXgGPDBTnsbKvb2FsBG5A
密码: 2f27
二. 配置
导入jar包后,一样需要Add As Library,使用jar包,如图:
add之后,如图:
这样我们就配置好了,接下来就是使用了
三. 实现
(1)url接口
解析数据肯定是需要数据源的,我用的是心知天气(我没收广告费)
private static final String url = "https://api.seniverse.com/v3/weather/daily.json?key=2szocxukyfblxx7d&location=shenzhen&language=zh-Hans&unit=c&start=0&days=1";
url的具体参数我就不去解释了,想知道的可以自己去看,有时我们项目也是需要获取天气的
(2)生成bean
有了数据源之后,我们还需要生成对应的bean文件,这样才能准确的获取各个数据,注意名称要和数据源的一样哦,
不然会出现解析错误。推荐大家一个Json转Java bean的工具,没用这工具之前,我们是要一个一个自己去写的,还怕
写错,用了之后,嘿嘿嘿,谁用谁知道。
工具地址:http://www.atool.org/json2javabean.php
把你从url获取的数据粘贴到上面的空白处,Class是url最外层的类(results),Package是你的项目包名,这里写自己的包名是
为了方便,生成后直接复制粘贴即可,不知道项目包名的萌新可以打开清单文件(AdnroidManifest.xml),如图:
点击生成JavaBean,就会根据你给的url自动生成一个或多个bean类,如图:
大写的Success,表示生成成功,如果url错误会提示哪错了。
生成后会有一段注释,这个不用管它,也不用粘贴到项目中,当然粘贴了也没事。
至此bean文件生成完毕。
(3)代码实现
public class MainActivity extends AppCompatActivity { //url接口 private static final String url = "https://api.seniverse.com/v3/weather/daily.json?key=2szocxukyfblxx7d" + "&location=shenzhen&language=zh-Hans&unit=c&start=0&days=1"; private Button btnStart; private TextView tvShow; Gson gson; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 1: String jsonData = (String) msg.obj; Log.i("textShow", "s = " + jsonData); //打印传过来的Json数据 GsonData(jsonData); //解析数据 break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); gson = new Gson(); initView(); } private void initView() { btnStart = (Button) findViewById(R.id.main_btn_start); tvShow = (TextView) findViewById(R.id.main_tv_show); btnStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { StringRequest request = new StringRequest(Request.Method.GET, url , new Response.Listener<String>() { @Override public void onResponse(String s) { Message msg = new Message(); msg.what = 1; msg.obj = s; handler.sendMessage(msg); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError volleyError) { } }); MyApplication.requestQueue.add(request); } }); } private void GsonData(String json) { WeatherBean weather = gson.fromJson(json, WeatherBean.class); List<Results> results = weather.getResults(); tvShow.setText("path :"+ results.get(0).getLocation().getPath()); //当数据多,需要获取所有数据时,需要写一个for循环来获取数据 } }
注: 这代码还是很简单的,有看不懂的请结合我的上一篇Volley网络请求看
Volley网络请求:https://blog.csdn.net/qq_26446715/article/details/80049564
(4)权限
<uses-permission android:name="android.permission.INTERNET"/>
(5)效果图
(6)拓展
很多时候我们面对的都是多层嵌套的json数据,这时我们单独用Gson解析会有部分数据解析不出来,显示null,
我们就需要用到JSONObject+JSONArray了,下面我们来看看怎么使用他们吧。
这是同一个收缩和展开的json数据,我们通过这两个来讲解更容易理解,不用那么抽象
JSONObject : “{}”大括号包裹的是对象,比如图中的location.
JSONArray : “[]”中括号包裹的是数组对象,比如图中的results,daily.
接下来看我们怎么获取对应的子数据:
try { JSONObject object = new JSONObject(json); //获取整个url对象,需要try catch JSONArray array = object.getJSONArray("results"); //获取results数组对象 for (int i = 0; i < array.length(); i++) { JSONObject jsonObject = array.getJSONObject(i); //获取results下的所有对象 JSONObject location = jsonObject.getJSONObject("location"); //获取location对象 String id = location.getString("id"); //获取location下id的数据 JSONArray daily = jsonObject.getJSONArray("daily"); //获取daily数组对象 for (int j = 0; j < daily.length(); j++) { JSONObject dailys = daily.getJSONObject(j); //获取daily数组下的所有对象 String date = dailys.getString("date"); //获取daily下的date子项数据 } Object last = jsonObject.get("last_update"); //它下面再没有数组或对象,可值得读值 String last_update = last.toString(); //获取last_update数据 } } catch (JSONException e) { e.printStackTrace(); }我是没有使用第三方库,因为这样可以更清楚的知道,JSONObject和JSONArray的区别,和什么时候改用哪个。
每天进步一点点!