首页 > 编程语言 >Java后台如何接收与处理JSON类型数据

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

时间:2023-01-29 20:45:20浏览次数:47  
标签:Java 对象 json 类型 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,类型,JSON,参数,数组,后台
From: https://www.cnblogs.com/yilangcode/p/17073273.html

相关文章

  • 后台列表字段-回调函数-关联字段显示标题
    回调函数名称: xb_admin_guanlian回调函数代码(文件:config/custom.php): functionxb_admin_guanlian($value,$param=[],$data=[],$field=[]){......
  • 1.Java基础语法
    一、关键字和保留字1.关键字2.保留字二、......
  • js 把字符串转成json对象的三种方法
    转自:js将字符串转换成json的三种方式不管字符串是否含有转义字符,都能转换成Json对象1,js自带的eval函数,其中需要添加小括号eval('('+str+')');functionstrToJson(st......
  • JavaScript中实现sleep睡眠函数的几种简单方法(转)
    转自:JavaScript中实现sleep睡眠函数的几种简单方法一.什么是sleep函数?sleep是一种函数,他的作用是使程序暂停指定的时间,起到延时的效果。javascript好像诶呦提供sleep工......
  • Java SE Runtime Environment 6 Update 26
    ​​​​http://download.oracle.com/otn-pub/java/jdk/6u26-b03/jre-6u26-windows-i586.exe​​​​http://download.oracle.com/otn-pub/java/jdk/6u26-b03/jre-6u26-wind......
  • Java中this关键字的作用
    this关键字的作用 1.表示类中的属性2.可以使用this调用本类的构造方法3.this表示当前对象 1.1this调用本类中的属性classPerson{privateStringname;//姓......
  • Java数组
    Java数组数组是相同类型数据的有序集合每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们。数组的声明必须声明数组变量才能在程序中使用。dataTy......
  • Java反射之Field用法
    参考:https://www.cnblogs.com/ldq2016/p/6834643.htmlhttps://www.cnblogs.com/cuglkb/p/8463039.html工具类:publicclassObjectUtils{staticpublicfinalBo......
  • ORM哪家强?java,c#,php,python,go 逐一对比, 网友直呼:全面客观
    前言最近一段时间,我使用​​golang​​开发了一个新的​​ORM​​库。为了让这个库更好用,我比较研究了各语言的主流​​ORM​​库,发现有一些语言的​​ORM​​库确实很好用,......
  • [JPA错误]javax.persistence.EntityNotFoundException: Unable to find xxx
    解决方法:第一种:由于后来加上的实体、对象在之前的数据没有关联上,所以造成脏数据、故根本的解决方法,就是将之前的测试数据删除,重新添加数据就行了第二种:2.如果子表中......