Java后台如何接收与处理JSON类型数据
项目开发中偶尔会使用到某个为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对象参数错误的情况,符合预期:

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

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

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

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

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

测试过程中遇到的问题如下:
.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()先进行处理。如下图所示:

注意事项:
.a.页面中传递JSON类型的数据时最好是使用Java中的Object类型类进行接收,解析的时候
使用JSON.toJSONString()转换一次即可,这样可以避免出现一些未知错误。如果从数据库中
查询的数据类型是JSON类型的,则不需要转换直接调用对象的toString()方法即可。
存储JSON类型的数据,Mysql可以考虑使用text字段;Postgresql数据库可以考虑使用jsonb类型
或者是json类型。
.b.如果不确定如何书写JSON类型的数据,则可以先打开谷歌浏览器,然后打开控制台,
进行简单的JOSN类型数据测试,JSON对象操作示例:

JSON数组操作示例:

.c.JSON对象、JSON数组、JSON对象数组的区别。
JSON对象:以一对{}符号包裹起来,全部是key-value形式的数据;
JSON数组:以一对[]符号包裹起来,数组形式的数据,数组里面的元素可以是JSON对象,也可以是字符串,或者是数组等等,没有限制;
JSON对象数组:以一对[]符号包裹起来,数组形式的数据,数组里面的元素只能是JSON对象。
Java后台如何接收与处理JSON类型数据的更多相关文章
- Struts2+Jquery实现ajax并返回json类型数据
来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...
- 转载:Struts2+Jquery实现ajax并返回json类型数据
摘要: 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数 ...
- MySQL JSON 类型数据操作
1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...
- json进阶(一)js读取解析JSON类型数据
js读取解析JSON类型数据 一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式,同 ...
- js读取解析JSON类型数据【申明:来源于网络】
js读取解析JSON类型数据[申明:来源于网络] 地址:http://blog.csdn.net/sunhuaqiang1/article/details/47026841
- C#操作json类型数据
将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象. 此类不能继承. // msdn 例子: namespace SL_DataContractJson ...
- Python数据结构同Json类型数据相互转换的用法
在做Python接口自动化的时候,经常要用到Python数据结构同Json类型数据相互转换来供我们做进一步的验证提供数据,在此做个记录和总结 Python数据结构同Json类型数据相互转换的函数有:j ...
- ajax接收遍历处理json格式数据
ajax在前后端的交互中应用非常广泛,通过请求后台接口接收处理json格式数据展现在前端页面. 下面我们来简单用 ajax在本地做一个接收并处理json的小例子 首先我们要新建一个叫做data的jso ...
- 用springmvc的@RequestBody和@ResponseBody 接收和响应json格式数据
1.controller @Controller @RequestMapping("/rest/v1") public class WelcomeController { @Req ...
- mysql 5.7 laravel json类型数据相关操作
2018年10月16日18:14:21 官方文档中文翻译版 原文:https://dev.mysql.com/doc/refman/5.7/en/json.html 最后有部分实例和一个小总结 11. ...
随机推荐
- 二十一、Pod的存储之Secret
Pod 的存储之Secret 一.Secret 存在意义 Secret 解决了密码.token.密钥等敏感数据的配置问题,而不需要把这些敏感数据暴露到镜像或者 Pod Spec中.Secret 可以 ...
- Python3.11正式版,它来了!
转载请注明出处️ 作者:测试蔡坨坨 原文链接:caituotuo.top/b055fbf2.html 你好,我是测试蔡坨坨. 就在前几天,2022年10月24日,Python3.11正式版发布了! P ...
- Go语言核心36讲33
我们在前几次讲的互斥锁.条件变量和原子操作都是最基本重要的同步工具.在Go语言中,除了通道之外,它们也算是最为常用的并发安全工具了. 说到通道,不知道你想过没有,之前在一些场合下里,我们使用通道的方式 ...
- java8 (jdk 1.8) 新特性——Lambda
java8 (jdk 1.8) 新特性 --初步认识 1. 什么是lambda? 目前已知的是,有个箭头 -> 说一大段官方话,也没有任何意义 我们直接看代码: 之前我们创建线程是这样的 Ru ...
- python(牛客)试题解析1 - 简单
导航: 一.NC103 反转字符串 二.NC141 判断是否为回文字符串 三.NC151 最大公约数 四.NC65 斐波那契数列 五.字符按排序后查看第k个最小的字母 六.数组内取出下标相同的元素求和 ...
- ArcObjects SDK开发 003 宏观角度看ArcObjects SDK
1.为什么要宏观上看ArcObjects SDK ArcObjects SDK库是一个非常庞大复杂COM组件集合,ArcGIS10.0有1000多个枚举.90多个结构体.5000多个接口以及4000多 ...
- 【离线数仓】Day01-用户行为数据采集:数仓概念、需求及架构、数据生成及采集、linux命令及其他组件常见知识
一.数据仓库概念 二.项目需求及架构设计 1.需求分析 2.项目框架 3.框架版本选型 服务器选型:云主机 服务器规划 三.数据生成模块 1.数据基本格式 公共字段:所有手机都包含 业务字段:埋点上报 ...
- 基于opencv实现简单人脸检测
作用:在视频中自动检测出人脸 使用内容:灰度转换,分类器,矩形框选,圆形框选,摄像头读取及释放 代码逻辑: 先读取摄像头后, 对摄像头拍摄到的图片进行逐帧分析, 并对图像进行灰度转换后使用类选择器识别 ...
- 盘点现在用的SqlServer 5种分页方式和拉姆达表达式分页,进来看看吧。
现在基本上大家都在使用各种轮子自带的分页,大家是否还记得sql分页怎么写? 今天我们就来盘一盘怎么写和用哪种方式写. 欢迎大家评论区讨论. 1.ROW_NUMBER() OVER()方式(SQL201 ...
- 开局一张图,构建神奇的 CSS 效果
假设,我们有这样一张 Gif 图: 利用 CSS,我们尝试来搞一些事情. 图片的 Glitch Art 风 在这篇文章中 --CSS 故障艺术,我们介绍了利用混合模式制作一种晕眩感觉的视觉效果.有点类 ...