JSON的全称是JavaScript Object Notation,意思是JavaScript对象表示法,它是一种基于文本,独立于语言的轻量级数据交换格式。
JSON有两种表示结构,对象和数组。
对象结构以”{”大括号开始,以”}”大括号结束。中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。
{
key1:value1,
key2:value2,
...
}
其中关键字是字符串,而值可以是字符串,数值,true,false,null,对象或数组。
数组结构以”[”开始,”]”结束。中间由0或多个以”,”分隔的值列表组成,语法结构如代码。
[
{
key1:value1,
key2:value2
},
{
key3:value3,
key4:value4
}
]
字符串:指使用" "双引号或' '单引号包括的字符。
例如:var comStr = '这是一个字符串';
json字符串:指的是符合json格式要求的js字符串。
例如:var jsonStr = "{Age:'18',Name:'张三'}";
json对象:指符合json格式要求的js对象。
例如:var jsonObj = { Age: "18", Name: "李四" };
Java处理JSON数据有三个常用的类库Gson、Fastjson和Jackson。
一、Google的Gson
Gson是目前功能最全的Json解析神器,Gson的应用主要为toJson与fromJson两个转换函数,无依赖,不需要例外额外的jar,能够直接跑在JDK上。
而在使用这种对象转换之前需先创建好对象的类型以及其成员才能成功的将JSON字符串成功转换成相对应的对象。
类里面只要有get和set方法,Gson完全可以将复杂类型的json到bean或bean到json的转换,是JSON解析的神器。
Gson在功能上面无可挑剔,但是性能上面比FastJson有所差距。
1. bean转换json:toJson
Gson gson = new Gson();
String json = gson.toJson(obj);
2. json转换bean:fromJson
Gson gson = new Gson();
String json = "{\"id\":\"2\",\"name\":\"Json技术\"}";
Book book = gson.fromJson(json, Book.class);
3. json转换复杂的bean,比如List,Set : fromJson
// 将json转换成复杂类型的bean,需要使用TypeToken
Gson gson = new Gson();
String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
// 将json转换成List
List list = gson.fromJson(json, new TypeToken<List>() {}.getType());
// 将json转换成Set
Set set = gson.fromJson(json, new TypeToken<Set>() {}.getType());
4. 通过json对象直接操作json以及一些json的工具
GsonBuilder gsonBuilder = new GsonBuilder();
ResponseData responseData = gsonBuilder.create().fromJson(result, ResponseData.class);
5.JsonElement
JsonElement可以存JsonObject、JsonArray、JsonPrimitive、JsonNull类型的数据,便于多类型同时管理:
/**
* A class representing an element of Json. It could either be a {@link JsonObject}, a
* {@link JsonArray}, a {@link JsonPrimitive} or a {@link JsonNull}.
*
* @author Inderjeet Singh
* @author Joel Leitch
*/
public abstract class JsonElement {
//......
public boolean isJsonArray() {
return this instanceof JsonArray;
}
public boolean isJsonObject() {
return this instanceof JsonObject;
}
public boolean isJsonPrimitive() {
return this instanceof JsonPrimitive;
}
public boolean isJsonNull() {
return this instanceof JsonNull;
}
public JsonObject getAsJsonObject() {
if (isJsonObject()) {
return (JsonObject) this;
}
throw new IllegalStateException("Not a JSON Object: " + this);
}
public JsonArray getAsJsonArray() {
if (isJsonArray()) {
return (JsonArray) this;
}
throw new IllegalStateException("Not a JSON Array: " + this);
}
//......
二、阿里巴巴的Fastjson
Fastjson是一个Java语言编写的高性能的JSON处理器,由阿里巴巴公司开发。
无依赖,不需要例外额外的jar,能够直接跑在JDK上。
FastJson在复杂类型的Bean转换Json上会出现一些问题,可能会出现引用的类型,导致Json转换出错,需要制定引用。
FastJson采用独创的算法,将parse的速度提升到极致,超过所有json库。
1. bean转换json:toJSONString
// 将对象转换成格式化的json
JSON.toJSONString(obj, true);
// 将对象转换成非格式化的json
JSON.toJSONString(obj, false);
// 对于复杂类型的转换,对于重复的引用在转成json串后在json串中出现引用的字符,比如
// $ref":"$[0].books[1]
Student stu = new Student();
Set books= new HashSet();
Book book = new Book();
books.add(book);
stu.setBooks(books);
List list = new ArrayList();
for(int i=0;i<5;i++) {
list.add(stu);
}
String json = JSON.toJSONString(list, true);
2. json转换bean:parseObject
String json = "{\"id\":\"2\",\"name\":\"Json技术\"}";
Book book = JSON.parseObject(json, Book.class);
3. json转换复杂的bean,比如List,Map:parseObject
String json = "[{\"id\":\"1\",\"name\":\"Json技术\"},{\"id\":\"2\",\"name\":\"java技术\"}]";
// 将json转换成List
List list = JSON.parseObject(json, new TypeReference<ARRAYLIST>(){});
// 将json转换成Set
Set set = JSON.parseObject(json, new TypeReference<HASHSET>(){});
4. 通过json对象直接操作json
String propertyName = 'id';
String propertyValue = "";
String json = "{\"id\":\"1\",\"name\":\"Json技术\"}";
JSONObject obj = JSON.parseObject(json);
propertyValue = obj.get(propertyName));
三、Fasterxml的Jackson
Jackson 由 fasterxml 组织开发,相比 Fastjson,有着更强大的功能、更高的稳定性、更好的扩展性、更丰富的定制支持。Spring 默认使用的 json 解析工具就是 jackson。使用 jackson 需要注意,ObjectMapper对象是线程安全的,可以重复使用。
1. bean转换json:writeValueAsString
//将对象转成json字符串
Users users = new Users();
users.setAge(18);
users.setUsername("王五");
ObjectMapper objectMapper = new ObjectMapper();
try {
String jsonString = objectMapper.writeValueAsString(users);
System.out.println(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
//将list集合转换成json字符串
Users user2 = new Users();
user2.setAge(18);
user2.setUsername("张三");
Users user3 = new Users();
user3.setAge(18);
user3.setUsername("李四");
List<Users> jsonList = new ArrayList<>();
jsonList.add(user2);
jsonList.add(user3);
try {
String list = objectMapper.writeValueAsString(jsonList);
System.out.println(list);
} catch (IOException e) {
e.printStackTrace();
}
//将map集合转换成json字符串
Map<String, Users> map = new HashMap();
map.put("user2", user2);
map.put("user3", user3);
try {
String mapJson = objectMapper.writeValueAsString(map);
System.out.println(mapJson);
} catch (IOException e) {
e.printStackTrace();
}
2. json转换bean:readValue
//将json字符串转化为java对象
String userJson = "{\"username\":\"张三\",\"age\":18}";
ObjectMapper objectMapper = new ObjectMapper();
try {
Users users = objectMapper.readValue(userJson, Users.class);
System.out.println(users + ":" + users.getUsername() + "," + users.getAge());
} catch (IOException e) {
e.printStackTrace();
}
3. json转换复杂的bean,比如List,Map:readValue
//将json字符串转化成java的list集合
String jsonList = "{\"userList\":[{\"username\":\"李四\",\"age\":18},{\"username\":\"王五\",\"age\":18}]}";
try {
ListBean listBean = objectMapper.readValue(jsonList, ListBean.class);
System.out.println(listBean.getUserList());
} catch (IOException e) {
e.printStackTrace();
}
//将json转化成java的map集合
String jsonMap = "{\"username\":\"赵六\",\"age\":18}";
try {
Map map = objectMapper.readValue(jsonMap, Map.class);
System.out.println(map + ":" + map.get("username") + "," + map.get("age"));
} catch (IOException e) {
e.printStackTrace();
}
//将json字符串数组转换成Map的list集合。
String json = "[{\"username\":\"钱七",\"age\":11},{\"username\":\"王八\",\"age\":12}]";
try {
List<Map> list = objectMapper.readValue(json, List.class);
System.out.println(list.get(0).get("username"));
} catch (IOException e) {
e.printStackTrace();
}