1、概述
什么是JSON(JavaScript Object Notation)?一种轻量级的数据交换格式。特点:可读性强,传输效率高,数据体积小,描述性相对较差。
JSON更加适用于移动设备,尤其对于网络环境较差和流量限制的情况下,相对于XML格式的数据传输会更节省流量,传输效率更高。
JSON语法:
- 数据在键值对中 “key”:“value”
- 数据由逗号分隔
- 花括号保存对象 {,}
- 方括号保存数组 [,]
相关类及方法:在org.json.*;包中
JSONObject;
JSONArray;
optXXX(xxx,xxx);//获取某属性,有这个则返回这个属性,否则返回一个默认值
getXXX(xxx);//获取某属性值
put(xxx, xxx);//设置数据
has(xxx);//判断是否有某属性
JSON解析方式:
- 顺序解析
- 普通解析
- 框架解析
1.GSON
2.FastJson
…
###2、顺序解析由于这种解析方式比较繁琐不适用json串比较大的数据,因此现在用的很少了。
JSON数据:整体是个JSON数组
[
{
"name": "yiyi",
"age": 11
},
{
"name": "erer",
"age": 22
}
]
String s = "[{\"name\":\"yiyi\",\"age\":11},{\"name\":\"erer\",\"age\":22}]";
/**
* 比较古老的方式不建议使用
*
* @param s
* @throws IOException
*/
@SuppressWarnings("resource")
public void jxJson(String s) throws IOException {
// 生成JsonReader对象
JsonReader reader = new JsonReader(new StringReader(s));
// 开始解析json数组
reader.beginArray();
// 判断json数组是否还有json对象
while (reader.hasNext()) {
// 开始解析json对象
reader.beginObject();
// 判断json对象是否还有键值对
while (reader.hasNext()) {
// 得到键 值
String tagName = reader.nextName();
if (tagName.equals("name")) {
System.out.println("name:" + reader.nextString());
} else {
System.out.println("age:" + reader.nextInt());
}
}
// 解析对象结束
reader.endObject();
}
// 解析数组结束
reader.endArray();
}
输出结果:
通过代码可以看出整体解析过程和json串格式是一致的,按顺序执行,因此被我称为顺序解析。(若有问题,肯请指正)
3、普通解析
JSON数据:整体是个JSON对象
{
"user": [
{
"name": "yiyi",
"age": 11
},
{
"name": "erer",
"age": 22
}
],
"code": [
"Android",
"Ios",
"Php",
"Web"
]
}
/**
* JSON普通解析
*/
private void jxJson() throws JSONException {
String s = "{\"user\": [{\"name\": \"yiyi\",\"age\": 11},{\"name\": \"erer\",\"age\": 22}],\"code\": [\"Android\",\"Ios\",\"Php\",\"Web\"]}";
JSONObject jsonObject = new JSONObject(s);
JSONArray user = jsonObject.getJSONArray("user");
JSONArray code = jsonObject.getJSONArray("code");
for (int i = 0; i < user.length(); i++) {
String name = user.getJSONObject(i).getString("name");
int age = user.getJSONObject(i).getInt("age");
System.out.println("name:" + name + " age:" + age);
}
for (int i = 0; i < code.length(); i++) {
System.out.println("code:" + code.get(i));
}
}
输出结果:
4、框架解析
1.GSON
Gson是Google提供的用来在Java对象和JSON数据之间进行映射的框架。可以将一个JSON字符串转成一个Java对象,或者反过来。
Gson gson = new Gson();
gson.fromJson(xxx, xxx);// json映射对象
gson.toJson(xxx);// 对象转化为jso字符串
/**
* 解析json数据并映射成为一个对象
*/
String s = "{\"name\":\"yiyi\",\"age\":11}";
public void jxJson(String s) {
Gson gson = new Gson();
// 映射对象
User user = gson.fromJson(s, User.class);
System.out.println("name:" + user.getName());
System.out.println("age:" + user.getAge());
}
class User {
String name;
int age;
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;
}
输出结果:
/**
* 解析json数组并映射成为对象集合
*/
String s = "[{\"name\":\"yiyi\",\"age\":11},{\"name\":\"erer\",\"age\":22}]";
public void jxJson(String s) {
Type type = new TypeToken<LinkedList<User>>() {}.getType();
Gson gson = new Gson();
LinkedList<User> users = gson.fromJson(s, type);
for (User user : users) {
System.out.println("name:" + user.getName());
System.out.println("age:" + user.getAge());
}
}
输出结果:
如果使用Android Studio开发可下载GsonFormat插件,通过该插件把JSON数据映射成实体类。
2.FastJson