springboot 使用内部类接收复杂的json结构
背景 最近接到一个需求,是对上传的json文件进行解析,上传的json文件,里面内容结构比较复杂,即一个实体引用另一个实体,需要定义很多的实体去接收,实体太多,做法不是很优雅。这里使用内部类的写法去接收复杂的json数据结构,内部类里面还能嵌套内部类,不管多复杂,一个实体都可以搞定。
JSON文件内容结构如下图:
定义实体
public class Demo {
private String name;
private RequestObj request;
private List<Object> response;
/**
* 此处省略 getter 、setter 和toString
*
* @return
*/
// 定义内部类
public static class RequestObj {
private String method;
private List<RequestHeader> header;
private RequestUrl url;
private RequestBody body;
/**
* 此处省略 getter 和setter
*/
// 嵌套 定义内部类
public static class RequestHeader {
/**
* 代码省略
*/
}
// 嵌套 定义内部类
public static class RequestUrl {
/**
* 代码省略
*/
}
// 嵌套 定义内部类
public static class RequestBody {
/**
* 代码省略
*/
}
}
}
Controller 层
这篇文章是demo示例,就不写service层那些了。直接用controller层接收上传的json文件,并进行解析,代码如下。
/**
* 上传JSON数据 并解析
*
* @param file
* @return
*/
@PostMapping(value = "/uploadJson", produces = "application/json;charset=UTF-8")
public CommonResp uploadPostmanFileFromJson(@RequestParam(value = "file") MultipartFile mappingFile) {
InputStream is = null;
BufferedReader br = null;
StringBuffer sb = new StringBuffer();
String str = null;
try {
is = mappingFile.getInputStream();
br = new BufferedReader(new InputStreamReader(is));
while ((str = br.readLine()) != null) {
sb.append(str);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
// 将数据转成json类型
JSONObject jsonObject = JSONObject.parseObject(sb.toString());
// 取出item对象,组装json数组
JSONArray jsonArray = jsonObject.getJSONArray("item");
// 将json数组转成List形式
List<Demo> requestItems = JSONObject.parseArray(jsonArray.toJSONString(), Demo.class);
CommonResp resp = new CommonResp();
resp.setContent(requestItems);
return resp;
}
使用postman进行测试
CommonResp 是定义的返回实体,就不贴代码了。