Java后台如何接收与处理JSON类型数据

seo排名网 202 0

  项目开发中偶尔会使用到某个为JSON类型的字段,一个字段中又包含多个其他的字段。

这种设计方式是根据实际需要来进行处理的,比如规则可能包含多条,每一条规则又包含

多个字段;再比如一些特殊的应用场景如标签是key-value形式的,可能有多个不同的标签。

这些场景下使用JSON或者是JSON数组来处理就会非常方便。具体该如何使用呢?

请看下面的示例代码:

@PostMapping("/json/test")

public JsonResult jsonParamTest(@Validated @RequestBody JsonParamTest jsonParamTest){

JsonResult jsonResult = new JsonResult();

// 校验

try {

JSON.parseObject(JSON.toJSONString(jsonParamTest.getJsonObject()));

} catch (Exception ex) {

log.error("json 对象参数错误--->{}", ex);

return jsonResult.declareFailure("50001","json对象参数错误", "");

}

try {

JSON.parseArray(JSON.toJSONString(jsonParamTest.getJsonArray()));

} catch (Exception ex) {

log.error("json 数组参数错误--->{}", ex);

return jsonResult.declareFailure("50002","json 数组参数错误", "");

}

try {

JSONArray jsonArray = JSON.parseArray(JSON.toJSONString(jsonParamTest.getJsonObjectArray()));

for(int i = 0, len = jsonArray.size(); i < len; i++) {

jsonArray.getJSONObject(i);

}

} catch (Exception ex) {

log.error("json 对象数组参数错误--->{}", ex);

return jsonResult.declareFailure("50003","json 对象数组参数错误", "");

}

jsonResult.declareSuccess("测试成功:");

return jsonResult;

}

@Data

public class JsonParamTest {

/*

* 名称

*/

@NotNull(message = "名称不能为null")

private String name;

/*

* json 对象类型

*/

@NotNull(message = "json 对象参数不能为null")

private Object jsonObject;

/*

* json 数组类型

*/

@NotNull(message = "json 数组参数不能为null")

private Object jsonArray;

/*

* json 对象数组类型

*/

@NotNull(message = "json 对象数组参数不能为null")

private Object jsonObjectArray;

}

说明:上面的示例代码是一个简单的请求输入类,和一个Controller中的常规方法。输入类中使用的

是hibernate中validator校验框架进行初步校验,主要测试三种JSON数据类型,一种是JSON对象,

一种是JSON数组,一种是JSON对象数组。控制器中的方法主要用于校验传递的参数是否正确,如果

错误则直接返回不在进行处理。代码中都是使用Object类型来接收JSON类型的数据,具体原因后面

会详细讲解。

下面是测试结果:

测试方式一:json对象参数错误的情况,符合预期:

Java后台如何接收与处理JSON类型数据-第1张图片-seo排名网

测试方式二:json对象参数正确的情况,符合预期:

Java后台如何接收与处理JSON类型数据-第2张图片-seo排名网

测试方式三:json 数组参数错误的情况,符合预期:

Java后台如何接收与处理JSON类型数据-第3张图片-seo排名网

测试方式四:json 数组参数正确的情况,符合预期:

Java后台如何接收与处理JSON类型数据-第4张图片-seo排名网

测试方式五:json 对象数组参数错误的情况,符合预期:

Java后台如何接收与处理JSON类型数据-第5张图片-seo排名网

测试方式六:json 对象数组参数正确的情况,符合预期:

Java后台如何接收与处理JSON类型数据-第6张图片-seo排名网

测试过程中遇到的问题如下:

.a.如果JSON类型的数据使用String类型来接收,比如将上面jsonObject字段类型修改为String类型,会报如下的错误,

org.springframework.http.converter.HttpMessageNotReadableException: Invalid JSON input: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_OBJECT token

.b.如果JSON数组类型的数据使用String类型来进行接收,比如将上面jsonArray字段类型修改为String类型,会报如下的错误,

org.springframework.http.converter.HttpMessageNotReadableException: Invalid JSON input: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token; nested exception is com.fasterxml.jackson.databind.exc.MismatchedInputException: Cannot deserialize instance of `java.lang.String` out of START_ARRAY token

解决方法,JSON类型的数据统一使用Java中的Object类型来进行接收。

.c.解析JSON数据时,如果是使用Java中的Object类型类接收数据,不能直接调用Object类型的toString()方法,

需要使用JSON.toJSONString()先进行处理。如下图所示:

Java后台如何接收与处理JSON类型数据-第7张图片-seo排名网

注意事项:

.a.页面中传递JSON类型的数据时最好是使用Java中的Object类型类进行接收,解析的时候

使用JSON.toJSONString()转换一次即可,这样可以避免出现一些未知错误。如果从数据库中

查询的数据类型是JSON类型的,则不需要转换直接调用对象的toString()方法即可。

存储JSON类型的数据,Mysql可以考虑使用text字段;Postgresql数据库可以考虑使用jsonb类型

或者是json类型。

.b.如果不确定如何书写JSON类型的数据,则可以先打开谷歌浏览器,然后打开控制台,

进行简单的JOSN类型数据测试,JSON对象操作示例:

Java后台如何接收与处理JSON类型数据-第8张图片-seo排名网

JSON数组操作示例:

Java后台如何接收与处理JSON类型数据-第9张图片-seo排名网

.c.JSON对象、JSON数组、JSON对象数组的区别。

JSON对象:以一对{}符号包裹起来,全部是key-value形式的数据;

JSON数组:以一对[]符号包裹起来,数组形式的数据,数组里面的元素可以是JSON对象,也可以是字符串,或者是数组等等,没有限制;

JSON对象数组:以一对[]符号包裹起来,数组形式的数据,数组里面的元素只能是JSON对象。

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~