项目开发中偶尔会使用到某个为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类型数据的更多相关文章

  1. Struts2+Jquery实现ajax并返回json类型数据

    来源于:http://my.oschina.net/simpleton/blog/139212 摘要 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的 ...

  2. 转载:Struts2+Jquery实现ajax并返回json类型数据

    摘要: 主要实现步骤如下: 1.JSP页面使用脚本代码执行ajax请求 2.Action中查询出需要返回的数据,并转换为json类型模式数据 3.配置struts.xml文件 4.页面脚本接受并处理数 ...

  3. MySQL JSON 类型数据操作

    1.Java 中动态扩展字段,会导致数据库表被锁,在MySQL 5.7.8版本之前,因为MySQL不能直接操作JSON类型数据,可以将一个字段设定成varchar类型,里面存放JSON格式数据,这样在 ...

  4. json进阶(一)js读取解析JSON类型数据

    js读取解析JSON类型数据 一.什么是JSON? JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式,同 ...

  5. js读取解析JSON类型数据【申明:来源于网络】

    js读取解析JSON类型数据[申明:来源于网络] 地址:http://blog.csdn.net/sunhuaqiang1/article/details/47026841

  6. C#操作json类型数据

    将对象序列化为 JavaScript 对象表示法 (JSON),并将 JSON 数据反序列化为对象. 此类不能继承. // msdn 例子: namespace SL_DataContractJson ...

  7. Python数据结构同Json类型数据相互转换的用法

    在做Python接口自动化的时候,经常要用到Python数据结构同Json类型数据相互转换来供我们做进一步的验证提供数据,在此做个记录和总结 Python数据结构同Json类型数据相互转换的函数有:j ...

  8. ajax接收遍历处理json格式数据

    ajax在前后端的交互中应用非常广泛,通过请求后台接口接收处理json格式数据展现在前端页面. 下面我们来简单用 ajax在本地做一个接收并处理json的小例子 首先我们要新建一个叫做data的jso ...

  9. 用springmvc的@RequestBody和@ResponseBody 接收和响应json格式数据

    1.controller @Controller @RequestMapping("/rest/v1") public class WelcomeController { @Req ...

  10. mysql 5.7 laravel json类型数据相关操作

    2018年10月16日18:14:21 官方文档中文翻译版 原文:https://dev.mysql.com/doc/refman/5.7/en/json.html 最后有部分实例和一个小总结 11. ...

随机推荐

  1. .Net Core&RabbitMQ限制循环消费

    前言 当消费者端接收消息处理业务时,如果出现异常或是拒收消息将消息又变更为等待投递再次推送给消费者,这样一来,则形成循环的条件. 循环场景 生产者发送100条消息到RabbitMQ中,消费者设定读取到 ...

  2. 学习ASP.NET Core Blazor编程系列九——服务器端校验

    学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

  3. JS 学习笔记 (六) 函数式编程

    1.函数闭包 1.1 概述 JavaScript采用词法作用域,函数的执行依赖于变量作用域,这个作用域是在函数定义时决定的,而不是函数调用时决定的. 为了实现这种词法作用域,JavaScript函数对 ...

  4. 元数据Metadata到底有什么用

    什么是元数据 元数据Metadata很简单,是关于数据的数据.这就意味着是数据的描述和上下文.他有助于组织和发现理解数据. 举例: 1张照片中除了照片本身还是,照片的时间日期,大小,格式相机设置,地理 ...

  5. RabbitMq简单模式

    RabbitMq简单模式 定义一个生产者,负责发送消息到队列中 /** * @author zjh * 生产者发信息 */ public class Producer { /** * 队列名称 */ ...

  6. PHPMQTT问题一二三

    问题一:PHPMQTT作为客户端订阅超过一定数量的主题后,系统就会报错. 思路:在网上查找原因,失败: 打开调试debug = true ; 结果proc方法中报错: eof receive 问题二: ...

  7. Java-(array)数组的基本概念 及 Java内存划分

    (array)数组的基本概念 数组的概念:是一种容器,可同时存放多个数据值 数组的特点: 1.数组是一种引用数据类型 2.数组当中的多个数据,类型必须统一 3.数组的长度在程序运行期间不可改变 数组的 ...

  8. Training: WWW-Robots

    原题链接:http://www.wechall.net/challenge/training/www/robots/index.php 打开网页他给我们说什么 说什么这是一个小挑战,你将会了解到机器人 ...

  9. uni-ajax使用示例

    官网 基于 Promise 的轻量级 uni-app 网络请求库 uni-ajax官网:https://uniajax.ponjs.com 安装 插件市场 在 插件市场 右上角选择 使用 HBuild ...

  10. C++编程笔记(GPU并行编程-2)

    C++与CUDA 内存管理 封装 利用标准库容器实现对GPU的内存管理 #include <iostream> #include <cuda_runtime.h> #inclu ...