`
coolxing
  • 浏览: 870087 次
  • 性别: Icon_minigender_1
  • 来自: 北京
博客专栏
9a45b66b-c585-3a35-8680-2e466b75e3f8
Java Concurre...
浏览量:95955
社区版块
存档分类
最新评论

android笔记--JSON数据解析

阅读更多

[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, 方便的完成这项工作.
6
2
分享到:
评论

相关推荐

    Android XML和JSON解析代码

    Android XML和JSON解析的代码,学习笔记。

    Android随手笔记44之JSON数据解析

     本文将主要介绍在Android开发中,如何在服务器端创建JSON数据,以及如何在Android客户端对JSON数据进行解析。 1.JSON数据结构  在JSON中有两种数据结构:对象和数组。 1.1对象  在JSON中,一个对象以“{”...

    Android远程访问Struts2服务器程序(用到Json解析数据)

    服务器端采用Struts2编码,Android客户端采用Json解析它的数据 服务器端程序为ServerProject(用MyEclipse建立此项目),Android客户端程序代码为:AndroidHttpJSONActivity 注意Android客户端代码中,有一个ip地址,...

    Android学习笔记45之gson解析json

    JSON即JavaScript Object Natation,是一种轻量级的数据交换格式,采用完全独立于语言的...通过本篇文章给大家介绍Android学习笔记45之gson解析json的相关内容,对android gson解析json相关知识感兴趣的朋友一起学习吧

    初学者的福音,android基础学习笔记

    此代码工程包内容包含有:四大组件,ListView,AutoCompletetEXT,ExpandableListView,身份验证,Volley的应用,json数据解析,照片墙,验证码,短信,电话,引导页,异步任务!【初学者专用】

    android笔记

    非常强大的学习资源集锦,不管是新手还是正在学习的都很有帮助。有android基础、UI、源码、十几个项目开发教程(手机卫士、百度地图等)json解析、LiistView优化(省略号)好用记得点个赞

    IPMapper-Android:可以通过提供的JSON API呈现地图标记或热图数据的Android应用。 LIS4331的项目。 (笔记

    然后从PHP脚本以JSON形式返回数据,然后由应用程序解析以显示在地图上。 奖励:使用适用于Android的Google Maps API。 奖励:支持对地图标记进行聚类以提高性能。 奖励:根据位置数据生成一个热图。

    Java 知识汇总(资源,工具,笔记,源码,文章,文档分类整理).zip

    常用的json解析框架的使用; - **Java进阶** 设计模式;多线程,虚拟机,性能优化技巧,反射,复杂算法(红黑树,贪心,动态规划等),网络通信; ## 功能模块 - 【Okhttp接口测试】在[com.gradle.http.uas](/tree/master...

    android-test:使用自定义适配器实现 RecycleView

    笔记: 依赖注入(Dagger)和视图注入(Butterknife) 可重用的自定义适配器,使用 RecyclerView,带有 Header View 交易列表 UI 的可重用自定义组件谷歌地图关注点分离使用 Jackson 库的 Json 解析器。 集中造型。 ...

    CurrencyConverter:用于货币转换的 Android 应用程序。 目前公测

    通过 JSON 和 XML 流解析使用 Yahoo 货币 api。 所有汇率都离线存储以备将来使用。 上下文菜单支持允许复制结果。 演示了单元测试、 ContentProvider 、 SQLite 、 AsyncTaskLoader 、 SharedPreferences 、

    典型相关分析matlab实现代码-AndroidNote:AndroidNote

    Json解析 常用工具 依赖注入 快速开发 动态加载 热修复 事件总线 性能工具 图表 响应式编程 日志框架 第二部分 博客社区 个人博客 团队博客 技术社区 技术周报 第三部分 技术书籍 计算机基础 本书是大学计算机相关...

    典型相关分析matlab实现代码-Note:笔记

    Json解析 常用工具 依赖注入 快速开发 动态加载 热修复 事件总线 性能工具 图表 响应式编程 日志框架 第二部分 博客社区 个人博客 团队博客 技术社区 技术周报 第三部分 技术书籍 计算机基础 本书是大学计算机相关...

    Flixster:适用于CodePath Android开发的Flixster应用程序

    Flix第2部分 用户故事 必选(10pts) (8分)在单独的活动中公开电影的详细信息(使用RatingBar进行评级,受欢迎程度和简介)。 (2分)允许使用YouTubePlayerView全屏...具有JSON解析的简单异步HTTP请求 -Android

    Simple-Tweet

    笔记没有使用的开源库具有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

    InstagramClone:Instagram一部分

    项目3- InstagramClone InstagramClone是类似于Instagram的照片共享应用程序,但使用Parse作为后端。...用户可以登录和注销其帐户。...使用的开源库具有JSON解析的简单异步HTTP请求 -Android的图片加载和缓存库执照

    InstaClone:出于学习目的而制作的流行应用“ Instagram”的克隆

    项目3-此处的应用程序名称InstaClone是与Instagram类似的照片共享应用,但使用Parse作为后端。... 用户可以登录和注销其帐户。...使用的开源库具有JSON解析的简单异步HTTP请求 -Android的图片加载和缓存库执照Co

    Flixter:正在剧院上映的电影的放映

    弗利克斯 Flix是一款允许用户从浏览电影的应用程序。 Flix第1部分 用户故事 必选(10pts) (10分)用户可以从电影数据库API中查看当前正在影院中...具有JSON解析的简单异步HTTP请求 适用于Android的图像加载和缓存库

Global site tag (gtag.js) - Google Analytics