- 浏览: 23331 次
- 性别:
- 来自: 北京
最新评论
什么是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:
[java] view plaincopy
package text.com.bean;
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 + "]";
}
}
[java] view plaincopy
package text.com.bean;
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 + "]";
}
}
首先使用方法一解析代码如下:
[java] view plaincopy
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包, 并将其添加到项目中. 具体的解析代码如下:
[java] view plaincopy
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\"}}]", 解析代码如下:
[java] view plaincopy
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数据同上, 具体代码为:
[java] view plaincopy
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, 方便的完成这项工作.
测试用例:
[java] view plaincopy
package text.com;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.List;
import text.com.bean.Address;
import text.com.bean.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class JsonTest {
String jsonString = "";
public static void main(String[] args) {
// Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",
// "30号"));
// Person p2 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",
// "30号"));
// Person p3 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",
// "30号"));
// List<Person> list = new ArrayList<Person>();
// list.add(p1);
// list.add(p2);
// list.add(p3);
// Gson gson = new Gson();
// Type typeOfT = new TypeToken<List<Person>>(){}.getType();
// String json = gson.toJson(list, typeOfT);
// System.out.println("json:"+json);
// String str = readTxtFile("D:\\cjjworkspace\\Test\\json.txt");
// System.out.println("文件内容:" + str);
Gson gson = new Gson();
// Type typeOfT = new TypeToken<List<Person>>(){}.getType();
// List<Person> personList = gson.fromJson(str, typeOfT);
Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海淀区", "30号"));
Type typeOfT = new TypeToken<Person>(){}.getType();
String str = gson.toJson(p1, typeOfT);
System.out.println(str);
}
public static String readTxtFile(String filePath) {
String encoding = "utf-8";
StringBuilder sb = new StringBuilder();
try {
File file = new File(filePath);
if (file.isFile() && file.exists()) { // 判断文件是否存在
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String str = "";
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
read.close();
return sb.toString();
} else {
System.out.println("找不到指定的文件");
return null;
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return sb.toString();
}
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:
[java] view plaincopy
package text.com.bean;
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 + "]";
}
}
[java] view plaincopy
package text.com.bean;
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 + "]";
}
}
首先使用方法一解析代码如下:
[java] view plaincopy
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包, 并将其添加到项目中. 具体的解析代码如下:
[java] view plaincopy
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\"}}]", 解析代码如下:
[java] view plaincopy
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数据同上, 具体代码为:
[java] view plaincopy
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, 方便的完成这项工作.
测试用例:
[java] view plaincopy
package text.com;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.lang.reflect.Type;
import java.util.List;
import text.com.bean.Address;
import text.com.bean.Person;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
public class JsonTest {
String jsonString = "";
public static void main(String[] args) {
// Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",
// "30号"));
// Person p2 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",
// "30号"));
// Person p3 = new Person("zhangsan", 12, true, new Address("北京", "海淀区",
// "30号"));
// List<Person> list = new ArrayList<Person>();
// list.add(p1);
// list.add(p2);
// list.add(p3);
// Gson gson = new Gson();
// Type typeOfT = new TypeToken<List<Person>>(){}.getType();
// String json = gson.toJson(list, typeOfT);
// System.out.println("json:"+json);
// String str = readTxtFile("D:\\cjjworkspace\\Test\\json.txt");
// System.out.println("文件内容:" + str);
Gson gson = new Gson();
// Type typeOfT = new TypeToken<List<Person>>(){}.getType();
// List<Person> personList = gson.fromJson(str, typeOfT);
Person p1 = new Person("zhangsan", 12, true, new Address("北京", "海淀区", "30号"));
Type typeOfT = new TypeToken<Person>(){}.getType();
String str = gson.toJson(p1, typeOfT);
System.out.println(str);
}
public static String readTxtFile(String filePath) {
String encoding = "utf-8";
StringBuilder sb = new StringBuilder();
try {
File file = new File(filePath);
if (file.isFile() && file.exists()) { // 判断文件是否存在
InputStreamReader read = new InputStreamReader(new FileInputStream(file), encoding);// 考虑到编码格式
BufferedReader bufferedReader = new BufferedReader(read);
String str = "";
while ((str = bufferedReader.readLine()) != null) {
sb.append(str);
}
read.close();
return sb.toString();
} else {
System.out.println("找不到指定的文件");
return null;
}
} catch (Exception e) {
System.out.println("读取文件内容出错");
e.printStackTrace();
}
return sb.toString();
}
发表评论
-
android xml界面布局常用属性概括
2014-01-23 19:54 1856布局: 在 android 中我们常用的布局方式有这么 ... -
Android手机客户端通过JSP实现与Tomcat服务器端通信(Msql数据库,Json作为载体)
2014-01-22 17:52 2201--服务端代码 服务器端主要代码: 1.首先构建一个Perso ... -
HttpClient4.0
2014-01-18 10:20 540HttpClient程序包是一个实现了 HTTP 协议的客户端 ... -
afinal logoAndroid的快速开发框架 afinal
2014-01-13 08:49 1416Afinal简介 Afinal 是一个android的sqli ... -
Android使用Fragment嵌套Fragment的方式实现界面滑动
2014-01-11 14:23 2349// 主Activity public class HomeA ... -
关于安卓应用账号退出
2014-01-04 16:21 418首先,我们将管理Activity的功能通过一个扩展的Appli ... -
安卓学习的起源
2013-12-28 12:03 462首先我先自我简单介绍下,我是一名计算机系本科专业的毕业生,目前 ...
相关推荐
本教程将重点介绍如何使用Gson库在Java环境中解析JSON数据。 Gson是Google提供的一款开源库,它能够将Java对象转换为对应的JSON字符串,也可以将JSON数据反序列化为Java对象。这对于处理JSON数据非常方便。在本示例...
本文将深入探讨Gson库的使用,以及如何通过引入相关的jar包,如gson-2.0.jar、log4j-1.2.17.jar、slf4j-api-1.7.10.jar和slf4j-log4j12-1.7.10.jar,来实现JSON数据的处理。 首先,让我们了解Gson的核心功能。Gson...
总结,Android中解析JSON数据涉及的关键知识点包括JSON的基本结构、Gson库的使用、JSONObject和JSONArray的操作、Volley库的网络请求以及Retrofit框架的使用。这些工具和技术使得Android开发者能够高效地处理服务器...
**Android JSON解析框架GSON详解** 在Android应用开发中,数据交换经常采用JSON格式,因为它轻量级、易于阅读和编写,并且被广泛支持。为了高效地解析和生成JSON,Google提供了一个强大的库——GSON。GSON允许将...
本教程聚焦于老罗讲解的Android解析JSON数据的源码分析,这对于深入理解JSON处理以及优化应用程序性能至关重要。 首先,我们需要了解JSON的基本结构。JSON是一种基于键值对的格式,数据以键值对的形式存储,如{"key...
这个库使得在Java应用程序中处理JSON数据变得极其简单,无论是将Java对象序列化为JSON字符串,还是将JSON字符串反序列化为Java对象,Gson都能提供高效且灵活的解决方案。 1. **Gson库介绍** Gson是Google提供的...
2. **JsonElement**:这是Gson解析JSON的基本单元,包括JsonObject、JsonArray、JsonPrimitive和JsonNull四种类型,分别对应JSON的四种基本结构:对象、数组、原始值(字符串、数字、布尔等)和null。 3. **...
在Struts2中,可以使用GSON库将Java对象序列化为JSON字符串,再通过AJAX发送到客户端,这样前端就可以用JavaScript解析JSON数据并更新DOM。 jQuery是一个广泛使用的JavaScript库,简化了HTML文档遍历、事件处理、...
在Java世界里,有两个非常流行的库用于处理JSON,它们分别是Google的Gson框架和阿里巴巴的Fastjson框架。本篇文章将深入探讨这两个框架的使用方法和特性。 首先,我们来看一下`Gson`框架。Gson是由Google开发的一个...
在Android开发中,Gson库是Google提供的一款强大的JSON处理工具,它允许我们将Java对象转换为对应的JSON字符串,同时也能够将JSON数据解析成相应的Java对象。这篇详细的文章将深入探讨如何利用Gson进行高效的JSON...
Gson库,由Google开发并开源,是Java平台上的一个强大工具,专门用于将Java对象转换为JSON字符串,以及将JSON数据转换回Java对象。Gson-2.7.jar是Gson库的特定版本,提供了许多功能和改进,以满足开发者的各种需求。...
在Java编程环境中,解析JSON数据是一项常见的任务,特别是在与Web服务交互、API开发或处理来自服务器的数据时。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易读性和易于编写,被广泛用于...
在"ParseJsonDemo"这个示例中,很可能是实现了一个Android应用,该应用展示了如何使用Gson库解析JSON数据。通常,这个应用会包含以下步骤: 1. 创建一个Java对象模型,对应JSON数据结构。 2. 获取JSON数据,可以是...
本压缩包包含了7个用于Java解析JSON文件的必备jar包,通过解压并将这些jar包添加到您的项目类路径中,您可以轻松实现JSON处理。 1. **Jackson库**: - Jackson是Java最流行的JSON处理库之一,由 FasterXML 组织...
Gson是Google提供的一款强大的Java库,用于在Java对象和JSON数据之间进行映射。它使得Java对象可以轻松地转换成JSON格式,反之亦然。`gson-master`可能是一个包含Gson库源代码和示例项目的Git仓库,用于帮助开发者...
谷歌GSON库,版本2.2.1,是Google推出的一款强大的Java库,它使得Java对象和JSON数据之间的转换变得极其便捷。JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,因其易于人阅读和编写,同时也易于...
对于Java Web服务端获取JSON数据,通常涉及到Servlet、JSP或Spring MVC等框架。当客户端通过HTTP请求发送JSON数据时,服务端需要解析这些数据。例如,在Servlet中,可以使用HttpServletRequest的getInputStream方法...
在Android中,我们通常使用两种主要方法来解析JSON数据:Gson库和org.json库。Gson是Google提供的一个Java库,它可以将Java对象转换为JSON字符串,也可以将JSON字符串反序列化为等效的Java对象。而org.json库则是一...
4. 解析JSON响应:使用Gson或org.json库解析JSON数据,将数据绑定到UI组件,或者保存到数据库中。 5. 示例代码中的“2015年9月21日 114301json字符串解析好了”可能是一个具体的例子或测试用例,表明该示例项目中...
本教程将深入探讨如何结合使用Android的AsyncTask和Gson框架进行网络请求。 AsyncTask是Android SDK提供的一种轻量级机制,用于在后台线程执行耗时操作,如网络请求,然后在UI线程更新结果,避免了主线程被阻塞导致...