[coolxing按: 转载请注明作者和出处, 如有谬误, 欢迎在评论中指正.]
什么是JSON:
JSON即JavaScript Object Natation, 它是一种轻量级的数据交换格式, 与XML一样, 是广泛被采用的客户端和服务端交互的解决方案.
JSON对象: JSON中对象(Object)以"{"开始, 以"}"结束. 对象中的每一个item都是一个key-value对, 表现为"key:value"的形式, key-value对之间使用逗号分隔. 如:{"name":"coolxing", "age"=24, "male":true, "address":{"street":"huiLongGuan", "city":"beijing", "country":"china"}}. JSON对象的key只能是string类型的, 而value可以是string, number, false, true, null, Object对象甚至是array数组, 也就是说可以存在嵌套的情况.
JSON数组: JSON数组(array)以"["开始, 以"]"结束, 数组中的每一个元素可以是string, number, false, true, null, Object对象甚至是array数组, 数组间的元素使用逗号分隔. 如["coolxing", 24, {"street":"huiLongGuan", "city":"beijing", "country":"china"}].
JSON数据的解析:解析JSON数据, 首先需要明确待解析的是JSON Object还是JSON array, 然后需要确定采用哪种解析技术. android平台上一般有2种解析技术可供选择: android内置的org.json包和google的开源gson库. 以下将分别采用这两种技术解析JSON对象和JSON数组.
1. 采用android内置的org.json包解析JSON对象. 假设待解析的JSON数据为json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 其中\用于转义表达式中的双引号. 首先定义2个JavaBean:
public class Address {
private String street;
private String city;
private String country;
public Address() {
super();
}
public Address(String street, String city, String country) {
super();
this.street = street;
this.city = city;
this.country = country;
}
public String getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
@Override
public String toString() {
return "Address [street=" + street + ", city=" + city + ", country="
+ country + "]";
}
}
public class Person {
private String name;
private int age;
private boolean male;
private Address address;
public Person() {
super();
}
public Person(String name, int age, boolean male, Address address) {
super();
this.name = name;
this.age = age;
this.male = male;
this.address = address;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public boolean isMale() {
return male;
}
public void setMale(boolean male) {
this.male = male;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + ", male=" + male
+ ", address=" + address + "]";
}
}
下面是具体的解析代码:
JSONObject jsonObject = new JSONObject(json);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean male = jsonObject.getBoolean("male");
JSONObject addressJSON = jsonObject.getJSONObject("address");
String street = addressJSON.getString("street");
String city = addressJSON.getString("city");
String country = addressJSON.getString("country");
Address address = new Address(street, city, country);
Person person = new Person(name, age, male, address);
System.out.println(person);
LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象.
2. 采用gson库解析JSON对象. 假设带解析的JSON数据是json = "{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}", 首先需要到http://code.google.com/p/google-gson/下载jar包, 并将其添加到项目中. 具体的解析代码如下:
Gson gson = new Gson();
Person person = gson.fromJson(json, Person.class);
System.out.println(person);
LogCat的输出为Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], 说明已经正确解析了JSON对象, 是不是很简单?
3. 采用android内置的org.json包解析JSON数组. 假设待解析的JSON数据为json = "[{\"name\":\"coolxing\", \"age\"=24, \"male\":true, \"address\":{\"street\":\"huiLongGuan\", \"city\":\"beijing\", \"country\":\"china\"}}, {\"name\":\"min\", \"age\"=20, \"male\":false, \"address\":{\"street\":\"heiShiJiao\", \"city\":\"daLian\", \"country\":\"china\"}}]", 解析代码如下:
List<Person> persons = new ArrayList<Person>();
JSONArray jsonArray = new JSONArray(json);
for(int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.getJSONObject(i);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
boolean male = jsonObject.getBoolean("male");
JSONObject addressJSON = jsonObject.getJSONObject("address");
String street = addressJSON.getString("street");
String city = addressJSON.getString("city");
String country = addressJSON.getString("country");
Address address = new Address(street, city, country);
Person person = new Person(name, age, male, address);
persons.add(person);
}
System.out.println(persons);
LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.
4. 采用gson库解析JSON数组. 待解析的JSON数据同上, 具体代码为:
Gson gson = new Gson();
Type listType = new TypeToken<List<Person>>(){}.getType();
List<Person> persons = gson.fromJson(json, listType);
LogCat的输出为[Person [name=coolxing, age=24, male=true, address=Address [street=huiLongGuan, city=beijing, country=china]], Person [name=min, age=20, male=false, address=Address [street=heiShiJiao, city=daLian, country=china]]], 说明已经正确解析了JSON数组.
new TypeToken<List<Person>>(){}.getType(); 这句代码表示创建一个TypeToken的匿名子类对象, 并调用对象的getType()方法.
org.json包和gson库还有很多其他有用的API, 需要的时候可查看文档. 比如有的时候需要通过java对象或java集合和数组生成json数据上传给服务器, 当然你可以自我构造json字符串, 但会很麻烦. 这个时候就可以使用其中的有关API, 方便的完成这项工作.
分享到:
相关推荐
Android XML和JSON解析的代码,学习笔记。
本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析。 1.JSON数据结构 在JSON中有两种数据结构:对象和数组。 1.1对象 在JSON中,一个对象以“{”...
服务器端采用Struts2编码,Android客户端采用Json解析它的数据 服务器端程序为ServerProject(用MyEclipse建立此项目),Android客户端程序代码为:AndroidHttpJSONActivity 注意Android客户端代码中,有一个ip地址,...
JSON即JavaScript Object Natation,是一种轻量级的数据交换格式,采用完全独立于语言的...通过本篇文章给大家介绍Android学习笔记45之gson解析json的相关内容,对android gson解析json相关知识感兴趣的朋友一起学习吧
此代码工程包内容包含有:四大组件,ListView,AutoCompletetEXT,ExpandableListView,身份验证,Volley的应用,json数据解析,照片墙,验证码,短信,电话,引导页,异步任务!【初学者专用】
非常强大的学习资源集锦,不管是新手还是正在学习的都很有帮助。有android基础、UI、源码、十几个项目开发教程(手机卫士、百度地图等)json解析、LiistView优化(省略号)好用记得点个赞
然后从PHP脚本以JSON形式返回数据,然后由应用程序解析以显示在地图上。 奖励:使用适用于Android的Google Maps API。 奖励:支持对地图标记进行聚类以提高性能。 奖励:根据位置数据生成一个热图。
常用的json解析框架的使用; - **Java进阶** 设计模式;多线程,虚拟机,性能优化技巧,反射,复杂算法(红黑树,贪心,动态规划等),网络通信; ## 功能模块 - 【Okhttp接口测试】在[com.gradle.http.uas](/tree/master...
笔记: 依赖注入(Dagger)和视图注入(Butterknife) 可重用的自定义适配器,使用 RecyclerView,带有 Header View 交易列表 UI 的可重用自定义组件谷歌地图关注点分离使用 Jackson 库的 Json 解析器。 集中造型。 ...
通过 JSON 和 XML 流解析使用 Yahoo 货币 api。 所有汇率都离线存储以备将来使用。 上下文菜单支持允许复制结果。 演示了单元测试、 ContentProvider 、 SQLite 、 AsyncTaskLoader 、 SharedPreferences 、
Json解析 常用工具 依赖注入 快速开发 动态加载 热修复 事件总线 性能工具 图表 响应式编程 日志框架 第二部分 博客社区 个人博客 团队博客 技术社区 技术周报 第三部分 技术书籍 计算机基础 本书是大学计算机相关...
Json解析 常用工具 依赖注入 快速开发 动态加载 热修复 事件总线 性能工具 图表 响应式编程 日志框架 第二部分 博客社区 个人博客 团队博客 技术社区 技术周报 第三部分 技术书籍 计算机基础 本书是大学计算机相关...
Flix第2部分 用户故事 必选(10pts) (8分)在单独的活动中公开电影的详细信息(使用RatingBar进行评级,受欢迎程度和简介)。 (2分)允许使用YouTubePlayerView全屏...具有JSON解析的简单异步HTTP请求 -Android
笔记没有使用的开源库具有JSON解析的简单异步HTTP请求 -Android的图片加载和缓存库执照Copyright [2021]Licensed under the Apache License, Version 2.0 (the "License");you may not use this file except in
项目3-立柱图Parstagram是类似于Instagram照片共享应用,但使用Parse作为后端。... 用户可以登录和注销其帐户。...使用的开源库具有JSON解析的简单异步HTTP请求 -Android的图片加载和缓存库执照Copyright
项目3- InstagramClone InstagramClone是类似于Instagram的照片共享应用程序,但使用Parse作为后端。...用户可以登录和注销其帐户。...使用的开源库具有JSON解析的简单异步HTTP请求 -Android的图片加载和缓存库执照
项目3-此处的应用程序名称InstaClone是与Instagram类似的照片共享应用,但使用Parse作为后端。... 用户可以登录和注销其帐户。...使用的开源库具有JSON解析的简单异步HTTP请求 -Android的图片加载和缓存库执照Co
弗利克斯 Flix是一款允许用户从浏览电影的应用程序。 Flix第1部分 用户故事 必选(10pts) (10分)用户可以从电影数据库API中查看当前正在影院中...具有JSON解析的简单异步HTTP请求 适用于Android的图像加载和缓存库