CommonUtil-常用的json工具类

本文最后更新于:3 years ago

这里介绍一下常用的json工具类,在我们后端开发的时候直接拿来用就可以了,会便捷很多。

successJson

首先是正常返回时,我们返回成功的JSON

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* 返回一个info为空对象的成功消息的json
*/

public static JSONObject successJson() {
return successJson(new JSONObject());
}

/**
* 返回一个返回码为100的json
*/

public static JSONObject successJson(Object info) {
JSONObject resultJson = new JSONObject();
resultJson.put("code", Constants.SUCCESS_CODE);
resultJson.put("msg", Constants.SUCCESS_MSG);
resultJson.put("info", info);
return resultJson;
}

errorJson

当非正常返回时,例如报错,则返回错误信息JSON

1
2
3
4
5
6
7
8
9
10
/**
* 返回错误信息JSON
*/

public static JSONObject errorJson(ErrorEnum errorEnum) {
JSONObject resultJson = new JSONObject();
resultJson.put("code", errorEnum.getErrorCode());
resultJson.put("msg", errorEnum.getErrorMsg());
resultJson.put("info", new JSONObject());
return resultJson;
}

查询分页

前端实现数据展示时,可能有上万行数据,所以查询分页是很有必要的。

默认展示行数

分页查询之前的处理参数,没有传pageRow参数时,默认每页10条:

1
2
3
public static void fillPageParam(final JSONObject paramObject) {
fillPageParam(paramObject, 10);
}

添加查询条件

在分页查询之前,为查询条件里加上分页参数,
pageRow是每页需要显示的结果数量(这里是10),pageNum是根据当前页的索引(从1开始),offSet就是第1,2…n行的第一个数据的索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/**
* @param paramObject 查询条件json
* @param defaultPageRow 默认的每页条数,即前端不传pageRow参数时的每页条数
* 每页需要显示的结果数量pageRow(这里是10),然后根据当前页的索引pageNum(从1开始)
*/

private static void fillPageParam(final JSONObject paramObject, int defaultPageRow) {
int pageNum = paramObject.getIntValue("pageNum");
pageNum = pageNum == 0 ? 1 : pageNum;
int pageRow = paramObject.getIntValue("pageRow");
pageRow = pageRow == 0 ? defaultPageRow : pageRow;
// offset ==> SQL中OFFSET条件,作用:假设展示第n页数据,offSet就是第n行的第一个数据的索引
paramObject.put("offSet", (pageNum - 1) * pageRow);
paramObject.put("pageRow", pageRow);
paramObject.put("pageNum", pageNum);
//删除此参数,防止前端传了这个参数,pageHelper分页插件检测到之后,拦截导致SQL错误
paramObject.remove("pageSize");
}

如果对SQL的分页查询有疑惑,可以去仔细看看↓

分页查询-廖雪峰的官方网站

分页查询结果封装

这里就是将分页后的数据(包括查询到的数据list和分页后的页数和结果数量以及总页数)整合成JSON,然后返回,又前端来呈现。

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
/**
* 查询分页结果后的封装工具方法
*
* @param requestJson 请求参数json,此json在之前调用fillPageParam 方法时,已经将pageRow放入
* @param list 查询分页对象list
* @param totalCount 查询出记录的总条数
*/

public static JSONObject successPage(final JSONObject requestJson, List<JSONObject> list, int totalCount) {
int pageRow = requestJson.getIntValue("pageRow");
int totalPage = getPageCounts(pageRow, totalCount);
JSONObject result = successJson();
JSONObject info = new JSONObject();
info.put("list", list);
info.put("totalCount", totalCount);
info.put("totalPage", totalPage);
result.put("info", info);
return result;
}

/**
* 获取总页数
*
* @param pageRow 每页行数
* @param itemCount 结果的总条数
*/

private static int getPageCounts(int pageRow, int itemCount) {
if (itemCount == 0) {
return 1;
}
return itemCount % pageRow > 0 ?
itemCount / pageRow + 1 :
itemCount / pageRow;
}

页面数据刷新

在添加/修改用户的时候会用到此方法来刷新页面

1
2
3
4
5
6
7
8
9
10
11
12
/**
* 查询分页结果后的封装工具方法
*
* @param list 查询分页对象list
*/

public static JSONObject successPage(List<JSONObject> list) {
JSONObject result = successJson();
JSONObject info = new JSONObject();
info.put("list", list);
result.put("info", info);
return result;
}

request ==> json

将request参数值转为json,直接调用

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
方法一
public static JSONObject request2Json(HttpServletRequest request) {
JSONObject requestJson = new JSONObject();
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String[] pv = request.getParameterValues(paramName);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pv.length; i++) {
if (pv[i].length() > 0) {
if (i > 0) {
sb.append(",");
}
sb.append(pv[i]);
}
}
requestJson.put(paramName, sb.toString());
}
return requestJson;
}

方法二
/**
* 将request转JSON
* 并且验证非空字段
*/

public static JSONObject convert2JsonAndCheckRequiredColumns(HttpServletRequest request, String requiredColumns) {
JSONObject jsonObject = request2Json(request);
hasAllRequired(jsonObject, requiredColumns);
return jsonObject;
}

检验必填字段

验证是否含有全部必填字段,没有则返回缺少的必填参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
/**
* @param requiredColumns 必填的参数字段名称 逗号隔开 比如"userId,name,telephone"
*/

public static void hasAllRequired(final JSONObject jsonObject, String requiredColumns) {
if (!StringTools.isNullOrEmpty(requiredColumns)) {
//验证字段非空
String[] columns = requiredColumns.split(",");
String missCol = "";
for (String column : columns) {
Object val = jsonObject.get(column.trim());
if (StringTools.isNullOrEmpty(val)) {
missCol += column + " ";
}
}
if (!StringTools.isNullOrEmpty(missCol)) {
jsonObject.clear();
jsonObject.put("code", ErrorEnum.E_90003.getErrorCode());
jsonObject.put("msg", "缺少必填参数:" + missCol.trim());
jsonObject.put("info", new JSONObject());
throw new CommonJsonException(jsonObject);
}
}
}

源码

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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
package com.heeexy.example.util;

import com.alibaba.fastjson.JSONObject;
import com.heeexy.example.config.exception.CommonJsonException;
import com.heeexy.example.util.constants.Constants;
import com.heeexy.example.util.constants.ErrorEnum;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.List;


public class CommonUtil {

/**
* 返回一个info为空对象的成功消息的json
*/

public static JSONObject successJson() {
return successJson(new JSONObject());
}

/**
* 返回一个返回码为100的json
*/

public static JSONObject successJson(Object info) {
JSONObject resultJson = new JSONObject();
resultJson.put("code", Constants.SUCCESS_CODE);
resultJson.put("msg", Constants.SUCCESS_MSG);
resultJson.put("info", info);
return resultJson;
}

/**
* 返回错误信息JSON
*/

public static JSONObject errorJson(ErrorEnum errorEnum) {
JSONObject resultJson = new JSONObject();
resultJson.put("code", errorEnum.getErrorCode());
resultJson.put("msg", errorEnum.getErrorMsg());
resultJson.put("info", new JSONObject());
return resultJson;
}

/**
* 查询分页结果后的封装工具方法
*
* @param requestJson 请求参数json,此json在之前调用fillPageParam 方法时,已经将pageRow放入
* @param list 查询分页对象list
* @param totalCount 查询出记录的总条数
*/

public static JSONObject successPage(final JSONObject requestJson, List<JSONObject> list, int totalCount) {
int pageRow = requestJson.getIntValue("pageRow");
int totalPage = getPageCounts(pageRow, totalCount);
JSONObject result = successJson();
JSONObject info = new JSONObject();
info.put("list", list);
info.put("totalCount", totalCount);
info.put("totalPage", totalPage);
result.put("info", info);
return result;
}

/**
* 查询分页结果后的封装工具方法
*
* @param list 查询分页对象list
*/

public static JSONObject successPage(List<JSONObject> list) {
JSONObject result = successJson();
JSONObject info = new JSONObject();
info.put("list", list);
result.put("info", info);
return result;
}

/**
* 获取总页数
*
* @param pageRow 每页行数
* @param itemCount 结果的总条数
*/

private static int getPageCounts(int pageRow, int itemCount) {
if (itemCount == 0) {
return 1;
}
return itemCount % pageRow > 0 ?
itemCount / pageRow + 1 :
itemCount / pageRow;
}

/**
* 将request参数值转为json
*/

public static JSONObject request2Json(HttpServletRequest request) {
JSONObject requestJson = new JSONObject();
Enumeration paramNames = request.getParameterNames();
while (paramNames.hasMoreElements()) {
String paramName = (String) paramNames.nextElement();
String[] pv = request.getParameterValues(paramName);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < pv.length; i++) {
if (pv[i].length() > 0) {
if (i > 0) {
sb.append(",");
}
sb.append(pv[i]);
}
}
requestJson.put(paramName, sb.toString());
}
return requestJson;
}

/**
* 将request转JSON
* 并且验证非空字段
*/

public static JSONObject convert2JsonAndCheckRequiredColumns(HttpServletRequest request, String requiredColumns) {
JSONObject jsonObject = request2Json(request);
hasAllRequired(jsonObject, requiredColumns);
return jsonObject;
}

/**
* 验证是否含有全部必填字段
*
* @param requiredColumns 必填的参数字段名称 逗号隔开 比如"userId,name,telephone"
*/

public static void hasAllRequired(final JSONObject jsonObject, String requiredColumns) {
if (!StringTools.isNullOrEmpty(requiredColumns)) {
//验证字段非空
String[] columns = requiredColumns.split(",");
String missCol = "";
for (String column : columns) {
Object val = jsonObject.get(column.trim());
if (StringTools.isNullOrEmpty(val)) {
missCol += column + " ";
}
}
if (!StringTools.isNullOrEmpty(missCol)) {
jsonObject.clear();
jsonObject.put("code", ErrorEnum.E_90003.getErrorCode());
jsonObject.put("msg", "缺少必填参数:" + missCol.trim());
jsonObject.put("info", new JSONObject());
throw new CommonJsonException(jsonObject);
}
}
}

/**
* 在分页查询之前,为查询条件里加上分页参数
*
* @param paramObject 查询条件json
* @param defaultPageRow 默认的每页条数,即前端不传pageRow参数时的每页条数
* 每页需要显示的结果数量pageRow(这里是10),然后根据当前页的索引pageNum(从1开始)
*/

private static void fillPageParam(final JSONObject paramObject, int defaultPageRow) {
int pageNum = paramObject.getIntValue("pageNum");
pageNum = pageNum == 0 ? 1 : pageNum;
int pageRow = paramObject.getIntValue("pageRow");
pageRow = pageRow == 0 ? defaultPageRow : pageRow;
paramObject.put("offSet", (pageNum - 1) * pageRow);
paramObject.put("pageRow", pageRow);
paramObject.put("pageNum", pageNum);
//删除此参数,防止前端传了这个参数,pageHelper分页插件检测到之后,拦截导致SQL错误
paramObject.remove("pageSize");
}

/**
* 分页查询之前的处理参数
* 没有传pageRow参数时,默认每页10条.
*/

public static void fillPageParam(final JSONObject paramObject) {
fillPageParam(paramObject, 10);
}
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!