解析JSON数据
来源:互联网 发布:java 分布式 dubbo 编辑:程序博客网 时间:2024/06/05 16:44
比起 XML,JSON的主要优势在于它的体积更小,在网络上传输的时 候可以更省流量。但缺点在于,它的语义性较差,看起来不如 XML直观
ps:
Apache服务器的下载与安装
htdocs下增加get_data.json文件
并加入如下 JSON格式的内容:
[{"id":"5","version":"5.5","name":"Angry Birds"},{"id":"6","version":"7.0","name":"Clash of Clans"},{"id":"7","version":"3.5","name":"Hey Day"}]
这时在浏览器中访问 http://127.0.0.1/get_data.json这个网址,可以得到
这样我们把 JSON格式的数据也准备好了,下面就开始学习如何在 Android程序 中解析这些数据吧
使用 JSONObject
类似地,解析 JSON数据也有很多种方法,可以使用官方提供的 JSONObject,也可以使 用谷歌的开源库 GSON。另外,一些第三方的开源库如 Jackson、FastJSON等也非常不错。这里先来学习JSONObject
以下代码仍然是基于
HttpURLConnection使用这篇文章进行的修改
修改 MainActivity中的代码
private void sendRequestWithURLConnection() { //开启线程发起网络请求 new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL("http://192.168.1.51/get_data.json"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); InputStream inputStream = connection.getInputStream(); //对获取的输入流进行读取 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } parseJSONWithJSONObject(response.toString()); } catch (MalformedURLException e) { } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void parseJSONWithJSONObject(String jsonData){ try { JSONArray jsonArray = new JSONArray(jsonData); for(int i=0;i<jsonArray.length();i++){ JSONObject jsonObject = jsonArray.getJSONObject(i); String id = jsonObject.getString("id"); String name = jsonObject.getString("name"); String version = jsonObject.getString("version"); Log.d("MainActivity", "id is " + id); Log.d("MainActivity", "name is " + name); Log.d("MainActivity", "version is " + version); } } catch (JSONException e) { } }
首先记得要将 HTTP请求的地址改成 http://自己电脑ip地址/get_data.json,
[查看电脑ip地址]
http://blog.csdn.net/u010356768/article/details/77744688
然后在得到了服务器 返回的数据后调用 parseJSONWithJSONObject()方法来解析数据
解析 JSON的 代码真的是非常简单,由于我们在服务器中定义的是一个 JSON数组,因此这里首先是将服 务器返回的数据传入到了一个 JSONArray对象中。然后循环遍历这个 JSONArray,从中取出 的每一个元素都是一个 JSONObject 对象,每个 JSONObject 对象中又会包含 id、name 和 version这些数据
接下来只需要调用 getString()方法将这些数据取出,并打印出来即可
使用 GSON
GSON是Google开发的Java API,用于转换Java对象和Json对象,它的github地址为
https://github.com/google/gson
使用
在项目的build.gradle中添加依赖
compile ‘com.google.code.gson:gson:2.8.2’
那么GSON库究竟是神奇在哪里呢?其实它主要就是可以将一段JSON格式的字符串自 动映射成一个对象,从而不需要我们再手动去编写代码进行解析了
比如说一段 JSON格式的数据如下所示:
{"name":"Tom","age":20}
那我们就可以定义一个 Person类,并加入 name和 age这两个字段
然后只需简单地调 用如下代码就可以将 JSON数据自动解析成一个 Person对象了:
Gson gson = new Gson();Person person = gson.fromJson(jsonData, Person.class);
如果需要解析的是一段 JSON数组会稍微麻烦一点,我们需要借助 TypeToken将期望解 析成的数据类型传入到 fromJson()方法中,如下所示:
List<Person> people = gson.fromJson(jsonData, new TypeToken<List<Person>>() {}.getType());
好了,基本的用法就是这样,下面就让我们来真正地尝试一下吧
首先新增一个 App 类,并加入 id、name和 version这三个字段,如下所示:
public class App { private String id; private String name; private String version; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; }}
然后修改 MainActivity中的代码,如下所示:
private void sendRequestWithURLConnection() { //开启线程发起网络请求 new Thread(new Runnable() { @Override public void run() { HttpURLConnection connection = null; try { URL url = new URL("http://192.168.1.51/get_data.json"); connection = (HttpURLConnection) url.openConnection(); connection.setRequestMethod("GET"); connection.setConnectTimeout(8000); connection.setReadTimeout(8000); InputStream inputStream = connection.getInputStream(); //对获取的输入流进行读取 BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder response = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { response.append(line); } parseJSONWithGSON(response.toString()); } catch (MalformedURLException e) { } catch (ProtocolException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }).start(); } private void parseJSONWithGSON(String jsonData){ Gson gson = new Gson(); List<App> appList = gson.fromJson(jsonData, new TypeToken<List<App>>() {}.getType()); for(App app:appList){ Log.d("MainActivity","id is "+app.getId()); Log.d("MainActivity","name is "+app.getName()); Log.d("MainActivity","version is "+app.getVersion()); } }
打印日志如下
- Newtonsoft.Json解析json数据
- 使用Json解析Json数据
- JavaScript 解析 JSON 数据
- JavaScript 解析 JSON 数据
- JAVA解析json数据
- jquery解析json数据
- jquery解析json数据
- android---Json数据解析
- Android Json 数据解析
- jquery解析json数据
- Gson解析Json数据
- json 的数据解析
- Android解析json数据
- Java解析JSON数据
- Jquery解析json数据
- eval 解析 json 数据
- 解析JSON数据
- JSON 数据解析
- 发布自己的android library到maven和jcenter
- NOIP复赛复习(十四)字符串算法巩固与提高
- 文章标题
- java线程安全之重入锁、锁与等待/通知、读写锁(十七)
- Android键盘显示与隐藏
- 解析JSON数据
- 调用另一类的静态,非静态属性的方法,静态块,构造块,运行先后
- ibaits中sqlMapClient.getCurrentConnection()返回null
- c#操作XML文件的通用方法
- 喷水装置(一)
- python数据分析(pandas入门)
- CBK告诉你:民族企业为什么应该走出国门,走向世界
- js单元测试(占坑)
- Centos7安装-多节点PbsPro