JSON轉化工具的使用
概述
JSON是一種輕量化的數據傳輸格式,在各種場景都有運用。比如在ajax中,服務端的數據一般通過JSON字符串的格式傳輸給前端,前端ajax引擎自動將JSON字符串轉化為JS對象(需要將ajax的返回內容格式設置為"json")。那么此時我們在后臺服務器中就需要將封裝好的JavaBean對象轉化為JSON格式字符串來傳輸給前臺ajax引擎,此時使用JSON轉化工具將大大簡化我們代碼量。
首先我們需要明確的是什么是JSON格式
JSON格式有兩種,一種是對象格式,另一種是數組格式(也可以叫集合)。
- 對象格式:{"key1":value1,"key2":value2......}
- 數組形式:[{對象1},{對象2}....]
需要注意的是
- 這里的value可以是字符串形式,也可以是數值形式,還可以是布爾型(除了字符串形式需要打引號,其他兩種都不用打)
- JSON嚴格的規定中,key是必須打雙引號的,不能為單引號,所以在java代碼手動連接JSON字符串時需要用轉義字符。
- 雖然在跟多環境中兼容key不打引號的JSON格式,但為了在所有環境下兼容我們還是都加上雙引號吧。
JSON轉換工具的使用
一. GSON轉換工具的使用
- 在使用之前我們需要引入所需的jar包(gson-2.2.4.jar)。
- 創建Gson對象。
- 調用該對象的toJson()方法。
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
CategoryService service=new CategoryService();
List<Category> list=service.getCategoryList();
//創建Gson對象
Gson gson=new Gson();
//調用toJson()方法
String json = gson.toJson(list);
response.setContentType("text/html;charset=UTF-8");
response.getWriter().write(json);
}
二.JSONLib轉換工具的使用
使用前需要導的包:
1.獲取JSON字符串中的屬性值(字符串->java對象)
public class Hello {
@Test
public void test() {
String jsonStr="{\"id\":\"123\",\"name\":\"tom\"}";
JSONObject json = JSONObject.fromObject(jsonStr);
int id = json.getInt("id");
String name=json.getString("name");
}
}
2.將Java對象轉換成JSON字符串(java對象->字符串)
在演示之前我們給出一個JavaBean對象(省略get和set方法):
public class User {
private Long uid;
private String email;
private Long initSize;
//get和set方法省略
}
2.1 將List集合轉換成JSON字符串數組形式(使用JSONArray對象)
public class Hello {
@Test
public void test() {
List<User> list=new ArrayList<>();
User u1 = new User();
u1.setUid(1L);
u1.setEmail("1@qq.com");
list.add(u1);
User u2=new User();
u2.setUid(2L);
u2.setEmail("2@qq.com");
list.add(u2);
//將List轉換成Json字符串
JSONArray json = JSONArray.fromObject(list);
String jsonStr=json.toString();
System.out.println(jsonStr);
}
}
輸出結果:
2.2將JavaBean對象轉換成JSON字符串對象形式(使用JSONObject方法)
public class Hello {
@Test
public void test() {
User u = new User();
u.setUid(1L);
u.setEmail("1@qq.com");
JSONArray json = JSONArray.fromObject(u);
String jsonStr=json.toString();
System.out.println(jsonStr);
}
}
輸出結果:
2.3.將現有對象轉換成JSON字符串時,添加排除屬性
在某些情況下,我們轉換對象中不是所有屬性都需要轉換成JSON字符串中,此時我們只需要添加排除即可。例如在2.1和2.2中User對象中的initSize屬性,我們不需要轉換成字符串,我們只需要這么做。
public class Hello {
@Test
public void test() {
User u = new User();
u.setUid(1L);
u.setEmail("1@qq.com");
//添加排除
JsonConfig config=new JsonConfig();
config.setExcludes(new String[] {"initSize"});
JSONObject json = JSONObject.fromObject(u,config);
String jsonStr=json.toString();
System.out.println(jsonStr);
}
}
輸出結果:
注:這里添加的排除,不是只對當前層級的Java對象有用,對當前層級中引用的其他對象中的屬性同樣有用。在有的Java對象中我們可能會封裝引用類型的屬性,也有可能多個對象的互相引用。在轉換時會由于形成了死循環而報錯。此時必須添加排除,破壞原先的循環嵌套才能成功轉換。
Java對象的嵌套循環導致轉換失敗的問題,詳見博主另一篇文章:
在SSH框架中,多個持久層對象相互引用,從而引發分頁查詢中,查詢所得的持久化對象轉換為JSON字符串報錯的原因及解決方案
FastJSON使用
在演示FastJSON的操作之前,我們先給出后面需要用到兩個實體類(其中getter和setter方法省略):
public class User {
private String name;
private int age;
@Override
public String toString() {
return "User [name=" + name + ", age=" + age + "]";
}
}
public class UserGroup {
private String name;
private List<User> users = new ArrayList<User>();
@Override
public String toString() {
return "UserGroup [name=" + name + ", users=" + users + "]";
}
}
一. 對象序列化
所謂序列化就是將對象轉換成字符串
// 序列化
@Test
public void testObjectToJson() throws Exception {
User user1 = new User();
user1.setName("張三");
user1.setAge(12);
// {"age":12,"name":"張三"}
String json = JSON.toJSONString(user1);
System.out.println(json);
}
@Test
public void testObjectToArray() throws Exception {
User user1 = new User();
user1.setName("張三");
user1.setAge(12);
User user2 = new User();
user2.setName("李四");
user2.setAge(12);
List<User> list = new ArrayList<User>();
list.add(user1);
list.add(user2);
UserGroup group = new UserGroup();
group.setUsers(list);
group.setName("root");
// 將List轉成JSON
// [{"age":12,"name":"張三"},{"age":12,"name":"李四"}]
String json = JSON.toJSONString(list);
System.out.println(json);
// 將UserGroup轉換成Json
// {"name":"root","users":[{"age":12,"name":"張三"},{"age":12,"name":"李四"}]}
String json2 = JSON.toJSONString(group);
System.out.println(json2);
}
二. 定制序列化
// 定制序列化
//如果age屬性<18,則在序列化時不顯示該屬性
@Test
public void testPrtopertyJson() throws Exception {
PropertyFilter filter = new PropertyFilter() {
@Override
public boolean apply(Object object, String name, Object value) {
// 如果age屬性<18,則在序列化時不顯示該屬性
if (name.equals("age")) {
if ((Integer) value < 18) {
return false;
}
}
return true;
}
};
User user1 = new User();
user1.setName("張三");
user1.setAge(18);
String jsonString = JSON.toJSONString(user1, filter);
System.out.println(jsonString);
}
三. 反序列化
// 反序列化為對象
@Test
public void testJsonToObj() throws Exception {
String json = "{\"age\":12,\"name\":\"張三\"}";
// JSON會盡最大可能轉換成User對象
User user = JSON.parseObject(json, User.class);
System.out.println(user);
}
// 反序列化為集合
@Test
public void testJsonToList() {
String json = "[{\"age\":12,\"name\":\"張三\"},{\"age\":12,\"name\":\"李四\"}]";
List<User> list = JSON.parseArray(json, User.class);
System.out.println(list);
}
// 反序列化為對象,對象里面包含List集合
@Test
public void testJsonToObj2() throws Exception {
String json = "{\"name\":\"root\",\"users\":[{\"age\":12,\"name\":\"張三\"},{\"age\":12,\"name\":\"李四\"}]}";
UserGroup group = JSON.parseObject(json, UserGroup.class);
System.out.println(group);
}

浙公網安備 33010602011771號