CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài viết trên blog CFSDN này cung cấp những phân tích chuyên sâu về ba cách (được khuyến nghị) để xây dựng chuỗi JSON, được tác giả sưu tầm và biên soạn. Nếu bạn quan tâm đến bài viết này, hãy nhớ thích nó.
Lời nói đầu: JSON là một định dạng trao đổi dữ liệu nhẹ được sử dụng rất phổ biến, đặc biệt là khi sử dụng Ajax. Việc đóng gói dữ liệu vào một chuỗi JSON ở chế độ nền thậm chí còn phổ biến hơn. Khi làm việc với các dự án trước đây, tôi đã sử dụng một số phương pháp để chuyển đổi mảng hoặc bộ sưu tập Danh sách thành chuỗi JSON trên phần phụ trợ, nhưng bây giờ nghĩ lại, tôi đã quên một chút. Bây giờ chúng ta hãy tóm tắt lại để nhớ kỹ các cách xây dựng chuỗi JSON này.
Các ghi chú cung cấp một số lượng lớn các ví dụ về mã. Cần lưu ý rằng hầu hết các ví dụ về mã đều được tôi viết mã và kiểm tra. Vui lòng sửa cho tôi bất kỳ thiếu sót nào~.
1. Fastjson của Alibaba.
1.Fastjson là bộ xử lý JSON được viết bằng ngôn ngữ Java, được phát triển bởi Alibaba và có các chức năng mạnh mẽ.
Nếu bạn muốn sử dụng công cụ của bên thứ ba, tất nhiên bạn phải nhập gói jar. Bạn chỉ cần nhập fastjson-1.2.8.jar để có được gói jar, bạn có thể tải xuống trực tiếp từ Internet hoặc bạn. có thể liên hệ với tôi
Hãy bắt đầu với một ví dụ đơn giản về fastjson. Đoạn mã sau xây dựng một phiên bản Khách hàng và chuyển đổi phiên bản này thành một chuỗi JSON. Nó gọi phương thức toJSONString() của com.alibaba.fastjson.JSON và chuyển vào phiên bản Khách hàng.
?
1
2
3
4
5
6
7
8
9
10
11
|
@Bài kiểm tra
công khai void test1() {
Khách hàng khách hàng = Khách hàng mới();
khách hàng.setId(1);
khách hàng.setCustName("Tom");
khách hàng.setAddress("Bắc Kinh");
Chuỗi jsonStr = JSON.toJSONString(khách hàng);
System.out.println(jsonStr);
}
|
Kết quả in: {"địa chỉ:"BeiJing","custName:"Tom","id":1}.
Chúng ta hãy thực hiện một thử nghiệm nhỏ khác để chuyển đổi bộ sưu tập Khách hàng của Danh sách thành chuỗi JSON. Ở dòng 22, chúng ta vẫn gọi trực tiếp phương thức toJSONString() của JSON và chuyển vào bộ sưu tập Danh sách.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/**
* Chuyển đổi bộ sưu tập Danh sách thành chuỗi JSON
*/
@Bài kiểm tra
công khai void test2() {
Danh sách<
Khách hàng
> danh sách = ArrayList mới<>();
Khách hàng khách hàng = Khách hàng mới();
khách hàng.setId(1);
khách hàng.setCustName("Tom");
khách hàng.setAddress("Bắc Kinh");
lists.add(khách hàng);
Khách hàng customer2 = Khách hàng mới();
khách hàng2.setId(1);
khách hàng2.setCustName("Bob");
customer2.setAddress("Thượng Hải");
danh sách.thêm(khách hàng2);
Chuỗi jsonStr = JSON.toJSONString(danh sách);
System.out.println(jsonStr);
}
|
8 }] 。
2. Hãy nghiên cứu sâu hơn. Hãy xem tình huống sau: Dòng 3 tạo một bộ sưu tập Danh sách khách hàng và Dòng 10 và 11 thực hiện thao tác thêm lặp lại. Vậy kết quả in trông như thế nào?
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Bài kiểm tra
công khai void test3() {
Danh sách<
Khách hàng
> danh sách = ArrayList mới<>();
Khách hàng khách hàng = Khách hàng mới();
khách hàng.setId(1);
khách hàng.setCustName("Tom");
khách hàng.setAddress("Bắc Kinh");
lists.add(khách hàng);
lists.add(khách hàng);
Chuỗi jsonStr = JSON.toJSONString(danh sách);
System.out.println(jsonStr);
}
|
Kết quả in: [{"địa chỉ:"BeiJing","custName:"Tom","id":1},{"$ref:"$[0]"}], bạn thấy đấy, Khách hàng thứ hai ví dụ không được in ra, điều này chứng tỏ rằng fastjson cấm tham chiếu vòng tròn theo mặc định. Nếu bạn muốn thay đổi tình huống này, bạn cần sử dụng toJSONString() của JSON. Điều này có thể được giải quyết bằng cách truyền tham số thứ hai SerializerFeature.DisableCircularReferenceDetect trong phương thức như sau:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Bài kiểm tra
công khai void test3() {
Danh sách<
Khách hàng
> danh sách = ArrayList mới<>();
Khách hàng khách hàng = Khách hàng mới();
khách hàng.setId(1);
khách hàng.setCustName("Tom");
khách hàng.setAddress("Bắc Kinh");
lists.add(khách hàng);
lists.add(khách hàng);
Chuỗi jsonStr = JSON.toJSONString(danh sách, SerializerFeature.DisableCircularReferenceDetect);
System.out.println(jsonStr);
}
|
Kết quả in tại thời điểm này là: [{"địa chỉ:"BeiJing","custName:"Tom","id":1},{"địa chỉ:"BeiJing","custName:"Tom", " id":1}], bạn nên thêm tham số thứ hai khi sử dụng phương thức toJSONString() của JSON trong tương lai.
3. Đi sâu hơn và xem xét một vấn đề chung. Lớp Phòng ban và Người quản lý duy trì mối quan hệ hai chiều một-một. Lớp Phòng ban có tham chiếu đến lớp Người quản lý và lớp Người quản lý có tham chiếu đến lớp Phòng ban. Hãy xem đoạn mã sau: Dòng 11 và 12 thiết lập liên kết và dòng 14 và 15 chuyển đổi chuỗi JSON.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Bài kiểm tra
công khai void test4() {
Người quản lý mgr = new Manager();
mgr.setMgrId(1);
mgr.setMgrName("Tom");
Phòng ban phòng ban = phòng ban mới();
bộ phận. setDeptId(2);
dept.setDeptName("DEV");
mgr. setDept(phòng ban);
dept.setManager(người quản lý);
Chuỗi jsonStr = JSON.toJSONString(dept, SerializerFeature.DisableCircularReferenceDetect);
// Chuỗi jsonStr = JSON.toJSONString(mgr, SerializerFeature.DisableCircularReferenceDetect);
System.out.println(jsonStr);
}
|
Câu trả lời là một ngoại lệ được ném ra, một java.lang.StackOverflowError phổ biến. Lý do ném ngoại lệ là do cả hai bên đều duy trì mối quan hệ và đi vào một vòng lặp vô hạn. Bạn có thể thêm chú thích @JSONField(serialize=false) vào một bên, như minh họa ở dòng 7, để giải quyết vấn đề.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
lớp công khai Khoa {
riêng tư Integer deptId;
chuỗi riêng tư deptName;
@JSONField(serialize=sai)
quản lý riêng tư quản lý;
công khai Integer getDeptId() {
trả về deptId;
}
công khai void setDeptId(Số nguyên deptId) {
này.deptId = deptId;
}
công khai String getDeptName() {
trả về deptName;
}
công khai void setDeptName(String deptName) {
this.deptName = deptName;
}
công khai Manager getManager() {
quản lý trả lại;
}
public void setManager(Quản lý quản lý) {
this.manager = người quản lý;
}
}
|
Kết quả in ra là: {"dept":{"deptId":2,"deptName:"DEV"},"mgrId":1,"mgrName:"Tom"} và kết quả cũng rất mỹ mãn.
4. Cuối cùng, một lớp công cụ fastjson được cung cấp, lớp này có thể được sử dụng trực tiếp trong quá trình phát triển để bạn tham khảo.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
gói qi.ssh.utils;
nhập java.io.IOException;
nhập java.util.Date;
nhập java.util.HashMap;
nhập java.util.Map;
nhập javax.servlet.http.HttpServletResponse;
nhập com.alibaba.fastjson.JSON;
nhập com.alibaba.fastjson.serializer.SerializerFeature;
lớp công khai FastJsonUtil {
/**
* Chuyển đổi đối tượng thành chuỗi json
* @param đối tượng
* @trở lại
*/
public static String toJSONString(Object đối tượng){
//DisableCircularReferenceDetect để tắt tính năng phát hiện tham chiếu vòng tròn
trả về JSON.toJSONString(đối tượng,SerializerFeature.DisableCircularReferenceDetect);
}
//xuất ra json
public static void write_json(HttpServletResponse response,String jsonString)
{
response.setContentType("ứng dụng/json;utf-8");
phản hồi.setCharacterEncoding("UTF-8");
thử {
phản hồi.getWriter().print(jsonString);
} bắt (IOException e) {
// TODO Khối catch được tạo tự động
e.printStackTrace();
}
}
/**
* chuỗi json để gọi lại sau khi gửi ajax
* @trở lại
*/
public static String ajaxResult(boolean thành công, String message)
{
Bản đồ map=new HashMap();
map.put("thành công", thành công);//Thành công hay không
map.put("tin nhắn", tin nhắn);//Tin nhắn văn bản
Chuỗi json= JSON.toJSONString(bản đồ);
trả về json;
}
/**
* Chuỗi JSON được tự động thêm tiền tố
* @param json chuỗi json gốc
* Tiền tố tiền tố @param
* @return chuỗi tiền tố
*/
công khai tĩnh String JsonFormatterAddPrefix(String json,String prefix,Map<
Sợi dây
,Đối tượng> bản đồ mới)
{
nếu(bản đồ mới == null){
newmap = HashMap mới();
}
Bản đồ<
Sợi dây
,Đối tượng> bản đồ = (Bản đồ) JSON.parse(json);
đối với (Chuỗi khóa: map.keySet())
{
Đối tượng đối tượng=map.get(key);
nếu(làThực thể(đối tượng)){
Chuỗi jsonString = JSON.toJSONString(đối tượng);
JsonFormatterAddPrefix(jsonString,tiền tố+khóa+".",bản đồ mới);
}khác{
newmap.put(tiền tố+khóa, đối tượng);
}
}
trả về JSON.toJSONString(newmap);
}
/**
* Xác định xem một đối tượng có phải là một thực thể hay không
* @param đối tượng
* @trở lại
*/
boolean tĩnh riêng tư isEntity(đối tượng đối tượng)
{
nếu(đối tượng thể hiện của String)
{
trả về false;
}
nếu(đối tượng thể hiện của Integer)
{
trả về false;
}
nếu(đối tượng instanceof Long)
{
trả về false;
}
nếu(đối tượng thể hiện của java.math.BigDecimal)
{
trả về false;
}
nếu(đối tượng instanceof Ngày)
{
trả về false;
}
nếu(đối tượng thể hiện của java.util.Collection )
{
trả về false;
}
trả về giá trị đúng;
}
}
|
2、Jackson 。
1. Bạn cũng cần nhập các gói jar. Jackson nhập ba gói jar.

Công dụng cụ thể còn được giải thích qua một ví dụ nhỏ:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
gói com.software.jackson;
nhập java.util.Arrays;
nhập java.util.List;
nhập com.fasterxml.jackson.annotation.JsonIgnore;
nhập com.fasterxml.jackson.core.JsonProcessingException;
nhập com.fasterxml.jackson.databind.ObjectMapper;
lớp công khai Khách hàng {
số nguyên riêng tư id;
chuỗi tên riêng tư;
public Khách hàng(int id, String tên) {
siêu();
id này = id;
this.name = tên;
}
công khai int getId() {
trả về id;
}
công khai void setId(int id) {
id này = id;
}
công khai String getName() {
trả về tên;
}
public void setName(String name) {
this.name = tên;
}
công khai String getCity(){
trả về "Bắc Kinh";
}
@JsonIgnore
công khai String getSchool(){
trả về "Trường học";
}
public static void main(String[] args) ném JsonProcessingException {
//Tạo đối tượng ObjectMapper
ObjectMapper ánh xạ = new ObjectMapper();
Khách hàng khách hàng = Khách hàng mới(1, "Tom");
Danh sách<
Khách hàng
> danh sách = Arrays.asList(khách hàng, Khách hàng mới(2, "Bob"));
//Gọi phương thức writeValueAsString(xxx) của ObjectMapper để truyền vào một hoặc nhiều đối tượng và chuyển đổi chúng thành chuỗi JSON
Chuỗi jsonStr = mapper.writeValueAsString(danh sách);
System.out.println(jsonStr);
}
}
|
Một lớp Khách hàng được xác định. Dòng 38 và 43 xác định hai phương thức get bổ sung và gán giá trị trực tiếp. Trong phương thức chính, tạo một đối tượng ObjectMapper, gọi phương thức writeValueAsString() của nó, truyền vào một đối tượng hoặc một tập hợp các đối tượng, và nó sẽ trả về JSON tương ứng Chuỗi, kết quả in là: [{"id":1,"name://Tom","city://BeiJing"},{"id":2,"name://Bob","city" :"BeiJing"}], bạn có thể thấy rằng Trường học trong phương thức getSchool() mà chúng tôi đã xác định ở dòng 43 không được in ra. Điều này là do chúng tôi đã thêm @JsonIgnore vào phương thức này. Chú thích, sau khi thêm chú thích này, thuộc tính này sẽ bị bỏ qua khi xây dựng chuỗi JSON. Nếu bạn suy nghĩ kỹ, chú thích này được thêm vào phương thức get, điều này cũng cho thấy Jackson xây dựng chuỗi JSON dựa trên phương thức getter.
2. Như trước đây, chúng tôi muốn xem liệu Jackson có cấm tham chiếu vòng tròn, mã tương tự hay không:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Bài kiểm tra
public void test2() ném JsonProcessingException {
Danh sách<
Khách hàng
> danh sách = ArrayList mới<>();
Khách hàng khách hàng = Khách hàng mới();
khách hàng.setId(1);
khách hàng.setCustName("Tom");
khách hàng.setAddress("Bắc Kinh");
lists.add(khách hàng);
lists.add(khách hàng);
ObjectMapper ánh xạ = new ObjectMapper();
Chuỗi jsonStr = mapper.writeValueAsString(danh sách);
System.out.println(jsonStr);
}
|
Chúng ta hãy xem kết quả đầu ra: [{"id":1,"custName":"Tom","address:"BeiJing"},{"id":1,"custName":Tom","address ": "BeiJing"}], kết quả là hiển nhiên.
3. Hãy cùng xem Jackson sẽ hoạt động như thế nào nếu nó giống như ví dụ ánh xạ một-một hai chiều của Bộ phận và Người quản lý được thử nghiệm trong Fastjson:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Bài kiểm tra
public void test1() ném JsonProcessingException {
Người quản lý mgr = new Manager();
mgr.setMgrId(1);
mgr.setMgrName("Tom");
Phòng ban phòng ban = phòng ban mới();
bộ phận. setDeptId(2);
dept.setDeptName("DEV");
mgr. setDept(phòng ban);
dept.setManager(người quản lý);
ObjectMapper ánh xạ = new ObjectMapper();
Chuỗi jsonStr = mapper.writeValueAsString(dept);
System.out.println(jsonStr);
}
|
Ngoại lệ tương tự vẫn sẽ xảy ra khi chạy trực tiếp. Nguyên nhân là do: java.lang.StackOverflowError. Ý tưởng của chúng tôi giống như thử nghiệm Fastjson. Chúng tôi thêm chú thích @JsonIgnore vào tham chiếu Trình quản lý trong Bộ phận. kết quả rất khả quan. Kết quả là: {"deptId":2,"deptName://DEV"} kém hơn nhiều so với kết quả đầu ra của Fastjson. Điều này cho thấy Fastjson mạnh mẽ như thế nào.
3、Google Gson 。
1. Hãy xem cách sử dụng nó: Gói jar chỉ cần một gson-2.2.4.jar. Không có gì để nói về việc chuyển đổi các đối tượng và bộ sưu tập thông thường thành JSON. Hãy trình bày ngắn gọn cách chuyển đổi một bộ sưu tập Danh sách thành một chuỗi JSON. . Trực tiếp sử dụng new để xuất đối tượng Gson, chỉ cần gọi phương thức toJson() của nó và truyền vào đối tượng cần chuyển đổi.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
@Bài kiểm tra
công khai void test2() {
Danh sách<
Khách hàng
> danh sách = ArrayList mới<>();
Khách hàng khách hàng = Khách hàng mới();
khách hàng.setId(1);
khách hàng.setCustName("Tom");
khách hàng.setAddress("Bắc Kinh");
lists.add(khách hàng);
Khách hàng customer2 = Khách hàng mới();
khách hàng2.setId(1);
khách hàng2.setCustName("Bob");
customer2.setAddress("Thượng Hải");
danh sách.thêm(khách hàng2);
Gson gson = Gson mới();
Chuỗi jsonStr = gson.toJson(danh sách);
System.out.println(jsonStr);
}
|
8 }] 。
2. Tài liệu tham khảo vòng tròn có bị cấm không?
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
@Bài kiểm tra
công khai void test3() {
Danh sách<
Khách hàng
> danh sách = ArrayList mới<>();
Khách hàng khách hàng = Khách hàng mới();
khách hàng.setId(1);
khách hàng.setCustName("Tom");
khách hàng.setAddress("Bắc Kinh");
lists.add(khách hàng);
lists.add(khách hàng);
Gson gson = Gson mới();
Chuỗi jsonStr = gson.toJson(danh sách);
System.out.println(jsonStr);
}
|
Kết quả đầu ra: [{"id":1,"custName":Tom","địa chỉ":"BeiJing"},{"id":1,"custName":Tom","địa chỉ":BeiJing" }], rõ ràng là không có.
3. Nếu có ánh xạ liên kết một-một hai chiều, Google Gson cũng sẽ gặp vấn đề về vòng lặp vô hạn và gây ra ngoại lệ java.lang.StackOverflowError. Tuy nhiên, Gson không cung cấp cho chúng tôi chú thích để giải quyết vấn đề này. vấn đề, LZ cung cấp một giải pháp. Ý tưởng là Google Gson sử dụng chiến lược ExclusionStrargety để tuần tự hóa một trường hoặc miền nhất định. Bạn có thể tùy chỉnh chú thích thông qua giao diện này để giải quyết vấn đề này. Tuy nhiên, nếu bạn cần chuyển đổi các đối tượng liên quan đến mối quan hệ hai chiều sang JSON, hãy sử dụng Fastjson.
4. So sánh đơn giản giữa ba phương pháp.
LZ so sánh ba cách để xây dựng chuỗi JSON từ các khía cạnh sau:
1. Xét về gói jar: Fastjson và Google Gson rõ ràng thắng, còn Jackson cần thêm 3 gói jar.
2. Chuyển đổi các đối tượng hoặc bộ sưu tập đơn giản sang JSON: Nếu bạn đang chuyển đổi các đối tượng hoặc bộ sưu tập đơn giản thông thường, Jackson và Google Gson có thể tốt hơn, ít nhất việc xây dựng cũng thuận tiện hơn.
3. Liên quan đến việc chuyển đổi các mối quan hệ hai chiều: Không còn nghi ngờ gì nữa, Fastjson của Alibaba sẽ giành chiến thắng.
Chúng tôi khuyên mọi người nên chọn một phương pháp nhất định một cách hợp lý theo nhu cầu của bản thân trong quá trình phát triển thực tế.
Phân tích chuyên sâu về 3 cách xây dựng chuỗi JSON (được khuyến nghị) ở trên là toàn bộ nội dung được editor chia sẻ, hy vọng có thể cho các bạn tham khảo và mong các bạn ủng hộ.
Liên kết gốc: http://www.cnblogs.com/crawl/p/7701856.html.
Cuối cùng, bài viết phân tích chuyên sâu về ba cách xây dựng chuỗi JSON (được khuyến nghị) kết thúc tại đây. Nếu bạn muốn biết thêm về phân tích chuyên sâu về ba cách xây dựng chuỗi JSON (được khuyến nghị), vui lòng tìm kiếm. Các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan, mong các bạn sẽ ủng hộ blog của mình trong thời gian tới! .
Tôi là một lập trình viên xuất sắc, rất giỏi!