前面介绍了XML的几种解析方法,可以看到,XML格式的数据本身比较重量级,虽然逻辑层次分明,但如果传输一些简单的数据,可能会消耗更多的网络带宽,因此,本博文将介绍一种更加轻量级的数据传输格式——JSON数据。
一、JSON的介绍
(一)简介
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式。它基于ECMAScript的一个子集。 JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(包括C、C++、C#、Java、JavaScript、Perl、Python等)。这些特性使JSON成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成(一般用于提升网络传输速率)。
(二)语法规则
JSON 语法是 JavaScript 对象表示语法的子集。
数据在键值对中
数据由逗号分隔
花括号保存对象
方括号保存数组
实例:
(1)名称/值对组合中的名称写在前面(在双引号中),值对写在后面(同样在双引号中),中间用冒号隔开:
“userName” : "Bill"
(2)一条完整的json数据
{"userPwd":"123","userName":"Bill","age":22}
(3)多条json数据进行传输的格式,即[{},{},{}],一个{}表示一条完整的json数据
[{"userPwd":"123","userName":"Bill","age":22},{"userPwd":"234","userName":"Tom","age":21},{"userPwd":"345","userName":"John","age":23}]
(三)JSON数据与Java类
从上可以看出,一条json数据是有多个键值对组成的,所以可以将该键值对作为java类的字段,这样在解析的时候可以将其保存起来,如上述中可以提炼出每条json数据都有userName,userPwd,age。因此可以将这三个属性作为Java类,如User的三个字段即可。
二、利用Java创建JSON数据
很多时候,JSON数据都是用来传输数据,所以json当中的每个字段多是动态生成的,这里,假设我们需要传输几个User对象,每个User有userName,userPwd,age三个字段。所以首先需要创建一个User模型类
(一)创建User.java,用于保存一条json数据的键值
/**
* 保存用户数据的模型类
*
* @author Bill56
*
*/
public class User {
// 用户名
private String userName;
// 密码
private String userPwd;
// 年龄
private int age;
/**
* 不带形参的构造方法
*/
public User() {
super();
}
/**
* 带参数的构造方法
*
* @param userName
* 用户名
* @param userPwd
* 密码
* @param age
* 年龄
*/
public User(String userName, String userPwd, int age) {
super();
this.userName = userName;
this.userPwd = userPwd;
this.age = age;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserPwd() {
return userPwd;
}
public void setUserPwd(String userPwd) {
this.userPwd = userPwd;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User [userName=" + userName + ", userPwd=" + userPwd + ", age=" + age + "]";
}
}
(二)创建json数据的方法
/**
* 根据一个User对象数组创建json数据,每个user对象为一个json数据,user对象中每个字段为json数据的字段内容
*
* @param users
* user对象的数组
* @return
*/
private static String createJSON(User[] users) {
// 创建一个保存json数据内容的字符串
String jsonInfo = new String();
// 创建json格式的数据对象,该对象是一个包含n个json数据对象的集合
try {
JSONArray jsonArray = new JSONArray();
// 循环User对象数组,根据每一个对象生成一个json数据,再将生成好的json数据放到jsonArray中去
for (int i = 0; i < users.length; i++) {
// 创建一个json类,对应User对象
JSONObject jsonUser = new JSONObject();
// 将user中每个字段的值放入jsonUser中
jsonUser.put("userName", users[i].getUserName());
jsonUser.put("userPwd", users[i].getUserPwd());
jsonUser.put("age", users[i].getAge());
// 将jsonUser放入jsonArray
jsonArray.put(jsonUser);
}
// 将jsonArray编程json字符串
jsonInfo = jsonArray.toString();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return jsonInfo;
}
(三)测试代码
public static void main(String[] args) {
// 创建几个User对象
User[] users = new User[] { new User("Bill", "123", 22), new User("Tom", "234", 21),
new User("John", "345", 23) };
String data = createJSON(users);
System.out.println(data);
}
三、利用Java解析json数据
(一)解析方法
/**
* 通过传入的json字符串数据解析json数据,并保存到User的列表中
*
* @param jsonData
* json数据
* @return 解析完json数据后保存的User列表对象
*/
private static ArrayList<User> parseJSON(String jsonData) {
ArrayList<User> usersList = new ArrayList<>();
try {
// 将json字符串转成jsonArray对象
JSONArray jsonArray = new JSONArray(jsonData);
// 解析jsonArray中的每一个json数据
for (int i = 0; i < jsonArray.length(); i++) {
// 获取一个json数据对象
JSONObject jsonObject = jsonArray.getJSONObject(i);
// 获取对应的值
String userName = jsonObject.getString("userName");
String userPwd = jsonObject.getString("userPwd");
int age = jsonObject.getInt("age");
// 根据解析的值创建一个User对象
User user = new User(userName, userPwd, age);
// 将解析后的对象添加到User列表中
usersList.add(user);
}
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return usersList;
}
(二)测试代码
public static void main(String[] args) {
// 创建几个User对象
User[] users = new User[] { new User("Bill", "123", 22), new User("Tom", "234", 21),
new User("John", "345", 23) };
String data = createJSON(users);
System.out.println(data);
// 解析json数据
ArrayList<User> list = parseJSON(data);
System.out.println(list);
}
谢谢您的关注和阅读,文章不当之处还请您不吝赐教~~~