JSON 的解析
来源:互联网 发布:达芬奇 调色软件 编辑:程序博客网 时间:2024/04/29 00:40
JSON 的全称是 JavaScript Object Notation,即 JavaScript 对象符号,是一种轻量级的数据交换格式。JSON 提供了多种语言之间完成数据交换的能力,是一种理想的数据交换格式。
JSON 主要有如下两种数据结构:
(1)、有 key-value 对组成的数据结构。
(2)、有序集合。
下面介绍 JSON 的解析方式:
------> 一般的解析;
------> 使用谷歌的 Gson 解析
------> 使用阿里巴巴的 fastJSON 解析(同 Gson 差不多,不介绍)
------> 从网络上解析
在 assets 目录下,新建一个 test.json;
{ "person": { "name": "张三", "age": 25, "children": [ { "name": "李四", "age":3 }, { "name": "王五", "age": 3 }, { "name": "小黑", "age": 1 } ] }}
(1)、一般的解析:
先从 assets 目录下读取文件:
/** * 读取 Assets 文件夹下的 test.json */ private String readFromAssets() { InputStream is = null; BufferedReader br = null; try { is = getAssets().open("test.json"); br = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(""); String str = null; while ((str = br.readLine()) != null) { sb.append(str); } return sb.toString(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null && is != null){ try { br.close(); is.close(); } catch (IOException e) { e.printStackTrace(); } } } return null; }
解析从 test.json 中读取的字符串:
/** * 普通解析 */ private void jieXiJson(String str){ try { JSONObject jsonObject = new JSONObject(str); JSONObject person = jsonObject.getJSONObject("person"); String name = person.getString("name"); Integer age = person.getInt("age"); int chiSum = person.getJSONArray("children").length(); Log.d("JSON解析", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个"); JSONArray children = person.getJSONArray("children"); for (int i = 0; i < chiSum; i++) { String jChiName = children.getJSONObject(i).getString("name"); int jChiAge = children.getJSONObject(i).getInt("age"); Log.d("=========","name: " + jChiName + ", 年龄: " + jChiAge); } } catch (JSONException e) { e.printStackTrace(); } }
结果如下:
(2)、使用 Gson 解析:
先下载 Gson ,如下:
使用 Gson 解析需要把 JSON 转换为对象(每个 key 都要有相应的对象),要新建几个类:
------> 从 JSON 结构可以看出有 3 个孩子(李四,王五,小黑),3 个孩子都有名字和年龄。所以创建 ChildrenT 类:
ChildrenT.java :
package com.crazy.forjson;/** * Created by antimage on 2016/1/3. */public class ChildrenT { private String name; private int age; public ChildrenT(String name, int age) { this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; }}
package com.crazy.forjson;import java.util.List;/** * Created by antimage on 2016/1/3. */public class Person { private List<ChildrenT> children; private String name; private int age; public List<ChildrenT> getChildren() { return children; } public String getName() { return name; } public int getAge() { return age; } public void setChildren(List<ChildrenT> children) { this.children = children; } public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; }}
现在只有 person ( key ) 没有解析了,所以新建一个有对象 person 的类,PersonT:
package com.crazy.forjson;/** * Created by antimage on 2016/1/3. */public class PersonT { private Person person; public Person getPerson() { return person; } public void setPerson(Person person) { this.person = person; }}
所需的类创建好后就可以使用 Gson 解析了(使用 fastJSON 都需要创建这几个类):
/** * 用谷歌的 Gson 解析 */ private void forGson(String str){ Gson gson = new Gson(); PersonT personT = gson.fromJson(str, PersonT.class); // ======================= person ====================== Person person = personT.getPerson(); String name = person.getName(); int age = person.getAge(); int chiSum = person.getChildren().size(); Log.d("person", "姓名:" + name + ", 年龄:" + age + ", 有多少个孩子:" + chiSum + "个"); // ======================= children ==================== List<ChildrenT> chiList = person.getChildren(); for (ChildrenT children : chiList) { String chiName = children.getName(); int chiAge = children.getAge(); Log.d("children", "姓名:" + chiName + ", 年龄:" + chiAge ); } }
(3)、从网络中解析 JSON:
从网络读取信息,首先加上相应的权限:
<uses-permission android:name="android.permission.INTERNET" />
网上的资源如下:
根据图片的信息,新建几个类(和前文的创建方法一样):
先创建类 UserT :
package com.crazy.forjson.fromnet;/** * Created by scxh on 2016/1/4. */public class UserT { private String id; private String userName; private String password; private String email; public String getId() { return id; } public void setId(String id) { this.id = id; } public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; }}
package com.crazy.forjson.fromnet;/** * Created by scxh on 2016/1/4. */public class UserFromNet { private UserT user; private String message; public UserT getUser() { return user; } public void setUser(UserT user) { this.user = user; } public String getMessage() { return message; } public void setMessage(String message) { this.message = message; }}
使用异步下载:
/** * 从网络读取信息 */ private class DownloadTask extends AsyncTask<String, Void, String> { @Override protected String doInBackground(String... params) { String str = params[0]; HttpURLConnection conn = null; BufferedReader br = null; try { URL url = new URL(str); conn = (HttpURLConnection)url.openConnection(); conn.setRequestMethod("GET"); conn.setDoInput(true); conn.setConnectTimeout(5000); conn.connect(); if(conn.getResponseCode() == 200){ InputStream is = conn.getInputStream(); br = new BufferedReader(new InputStreamReader(is)); StringBuilder sb = new StringBuilder(""); String str1 = null; while ((str1 = br.readLine()) != null) { sb.append(str1); } return sb.toString(); } } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (br != null && conn != null) { try { br.close(); conn.disconnect(); } catch (IOException e) { e.printStackTrace(); } } } return null; } @Override protected void onPostExecute(String forNet) { jieXiFromNet(forNet); } }
其中的方法 jieXiFromNet(String forNet):
/** * 解析从网络读取的字符串 json */ private void jieXiFromNet(String forNet) { Gson gson = new Gson(); UserFromNet ufn = gson.fromJson(forNet, UserFromNet.class); String message = ufn.getMessage(); Log.d("User 的 信息", "信息: " + message); //======================= UserT ut = ufn.getUser(); String id = ut.getId(); String userName = ut.getUserName(); String password = ut.getPassword(); String email =ut.getEmail(); Log.d("User 的详细信息", "证件号:" + id + ", 姓名:" + userName + ", 密码:" + password + ", 邮箱" + email); }
结果如下:
- json对象的解析,jquery 解析json
- json的解析方式
- Android的JSON解析
- json 的数据解析
- 解析JSON的过程
- jQuery的JSON解析
- JSON的解析
- 解析JSON的例子
- JSON数据的解析
- Android的Json解析
- Android的JSON解析
- Json的解析
- Android的JSON解析
- android json的解析
- 关于json的解析
- 解析自己的json
- 另类Json的解析
- JSon数据的解析
- 【bzoj4282】【慎二的随机数列】【dp】
- unix同步——条件变量
- input子系统event数据解析
- Linux内核工程导论——网络:Netfilter概览
- 我理解的云计算与大数据
- JSON 的解析
- 通过HttpURLConnection模拟post表单提交
- 【学习笔记javascript设计模式与开发实践(装饰者模式)----15】
- oc语言 KVO观察者模式
- hdu1028
- CocoaPods安装及使用
- 让测试团队慢慢死去!
- 调用相机和手机拍照
- IOS开发初体验