Spring Boot使用@JsonProperty,@JsonIgnore,@JsonFormat注解

Spring Boot使用@JsonProperty,@JsonIgnore,@JsonFormat注解,第1张

@JsonProperty, @JsonIgnore 和 @JsonFormat 注解都是 fasterxml jackson 里面的注解,现在也被 Spring Boot 集成了。

这里需要注意的是将对象转换成json字符串使用的方法是fasterxmljackson提供的!!

如果使用fastjson

<dependency>

<groupId>comalibaba</groupId>

<artifactId>fastjson</artifactId>

<version>1228</version>

</dependency>

没有生效,为啥?

因为fastjson不认识@JsonProperty注解呀!所以要使用jackson自己的序列化工具方法

我们在使用上面的注解时,不需要在 pomxml 显示的引入 fasterxml jackson 的依赖包。只需要加入如下依赖即可。

@JsonProperty

用于属性、setter / getter 方法上,属性序列化后可重命名

生成的 json 字符串就是image_width和image_height。

@JsonIgnore

属性使用此注解后,将不被序列化。

@JsonFormat

用于格式化日期

@JsonInclude,@JsonIgnoreProperties,@JsonIgnore

真实案例

{

"rowid": "111111",

"created": "2018-12-27 16:15:25",

"createdby": "1111111",

"lastupd": "2018-12-27 08:25:48",

"lastupdby": "111111",

"modificationnum": 1

}

返回Json参数字段均为小写,在接收时,需要按照标准的命名规则进行映射

解决办法:

创建接收数据对象,生成Get\Set方法:,在Set方法上,加上@JsonProperty注解,

@JsonProperty 此注解用于属性上,作用是把该属性的名称序列化为另外一个名称,如把rowId属性序列化为rowid,@JsonProperty("rowid")。

用于配置如何序列化属性值的详细信息的通用注释。与大多数其他Jackson注释不同,注释并没有特定的通用解释:相反,效果取决于所注释属性的数据类型(或者更具体地说,所使用的反序列化器和序列化器)

从Jackson 26开始,已知的特殊处理包括:

数字越小,越先被序列化。

ordinal属性的默认值是0,对于使用了@JSONField注解的字段,若未指定值,则优先级最高。

注意:序列化和反序列化使用JSONtoJSONString和JSONparseObject,如果使用JSONArray,在使用ordinal属性的时候可能会失效。

format设置之后在序列化时会自动转化为设定的格式。

了解一下日常开发中关于 Json 解析的一些非常规用法,以及使用 fastjson 的一些总结。

一般情况 Json 的使用都是非常简单的。 我们会根据上游定义的 Json 数据格式,由下游定义相应的解析模型。比如像下面这个简单的 Json 字符串。

一般会定义如下的数据类(以 Kotlin 为例)

具体使用也是非常简单了,无论是借助 fastjson 、gson 或者是原生的 JsonObject 都可以非常方便的完成数据的序列化和反序列 *** 作,比如以 fastjson 为例。

无论原始的 Json 数据格式多么的复杂,包含原始数据类型、List、数组还是他类型, 只要需要解析的属性的 key 是确定的,那么就可以定义出相应的数据模型来解析 。 因为在定义任何一个数据模型是时,对于其中的每一个字段(或者叫做属性、类成员),唯一需要确定的就是变量的类型和变量名的名称,比如面对下面这个略显复杂的 Json :

我们依旧可以定义出如下的数据模型

但有时候我们会遇到 Json 数据中,key 值无法确定的情况。也就是说,我们需要解析的字段名是不确定的。或者说,Json 数据中字段名和字段值重合的情况。

比如上面这个 Json ,按照日期返回一个 List(至于 List 里具体是什么,我们也无需关心)或者是其他任何数据,这里就比较有意思了。

既然返回的属性名是无法确定的,那么怎么定义 Json 对应的数据类型中的变量名呢 ?

上面 这里应该怎么定义呢? 毕竟总不能穷举所有日期吧? 再说也穷举不过来呀,时间是无限的呀。

这里就需要转换一下思路了,我们从本质出发,这里整个 Json 其实是一个 Map 。既然是一个 Map ,那我们就把他当做一个 Map 去解析好了。

因此,fastjson 在解析的时候不知道具体该怎么办了,只知道这是个把原始 Json 字符串解析为一个 Map 。剩下的就该靠我们自己了 fastjson 不知道具体类型,我们自己是知道的呀。因此,就需要遍历 map 自己去处理了。

到这里,我们就可以获取到原始 Json 字符串中的数据了。可以看到,对于上游返回的 Map 这种类型的数据,由于其本身灵活的特性,我们需要按具体的类型做具体拆解,没有通用的方法。

作为常用的 Json 序列化框架 ,这里总结一下使用 fastjson 遇到一些坑和收获。

日常开发中上游给我们的 Json 数据往往是很丰富的,并且由于 json 的特性,在一大段字符串中要找到我们关系的字段是有点困难的,因此我们往往把 Json 字符串贴到各类 Json解析助手之类的网站或工具里,进行格式化。其实,不用那么麻烦,fastjson 自身提供了可以格式化打印 Json 的方法。

这里格式化打印一下刚才的 map printBeautyJson(map)

从截图可以看到,已经实现了 Json 的格式化输出。SerializerFeature 还有很多其他很多实用的功能,可以按需要进行配置。

JSONField 是一个定义在 fastjson 内的注解,其中最常用的两个值是 serialize 和 deserialize ,都是 boolean 类型,用户决定对特定字段进行序列化和反序列化。

序列化毕竟是一个 IO *** 作,在优化性能的场景,我们就可以基于实际业务场景和需求出发,减少非必要的序列和反序列 *** 作,尤其是对一些比较打的对象。需要注意的是,deserialize 这个值只有把注解打在方法上时才是有效的(这点可以从其源码看到)。

最后再说一个使用 fastjson 最最常见的问题,关于默认构造函数的问题。

我们知道一个普通的 Java 类,如果没有定义构造函数的话,编译器会帮我们自定生成一个构造函数。但是如果我们自己定义了构造函数,那么默认的构造函数就没了。

这个时候如果我们直接解析 Json 解析,会抛出异常。 comalibabafastjsonJSONException: default constructor not found

至于具体原因,看一下源码也很容易理解了。这个时候,就只能把默认的构造加上了。

而在使用 Kotlin 的场景,也是存在同样的问题。

现在大家都习惯使用 data class 定义数据类。虽然这样定义的类型,从反编译的结果看似乎是存在默认构造函数的,但依旧会报错。

可以看到是有存在构造函数的,但是依旧会产生问题。对于 Kotlin 的场景,我们用两种解决办法。

这样依旧不解决问题。

to be continued

本文从 Json 解析常规用法出发,解读了对 Map 这种 Json 数据类型的解析。从中可以学习到,有时候我们在面临一些问题是会一筹莫展,会出现非常规的场景。这个时候,就需要我们从问题的本质出发,看透问题的根源,一层层抽丝剥缕的去解决。

问题总是会不断出现的,重要的是在我们解决完问题之后不仅要学会解决方法,更要学会解决问题的思路。

<%@ page language="java" import="javautil" pageEncoding="gbk"%>

<%@page import="orgjsonsimpleJSONObject"%>

<%@page import="orgjsonsimpleparserJSONParser"%>

<%@page import="orgjsonsimpleJSONValue"%>

<%@page import="orgjsonsimpleJSONArray"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 401 Transitional//EN">

<html>

<head>

<title>获取json内部数据html</title>

<meta >

<meta >

<meta >

<!--<link rel="stylesheet" type="text/css" href="/stylescss">-->

</head>

<body>

<table id="deptPersonList" title="部门信息列表" class="easyui-datagrid"

singleSelect="true" fit="true" pagination="true"

idField="deptPersonId" url="deptPersonInfo" width="800px"

rownumbers="false" striped="true">

<thead>

<tr>

<th field="deptPersonId" width="6" checkbox="true">

编号

</th>

<th field="sysPerson" width="60%" sortable="true">

人员名称

</th>

<th field="sysDepartment" width="30%" sortable="true">

部门名称

</th>

</tr>

</table>

</body>

<script type="text/javascript">

/

json格式如下

{"total":11,"rows":[{"deptPersonId":"1","sysDepartment":{"deptName":"人事"},"sysPerson":{"personName"}}]}

/

var json = {"total":11,

            "rows":[{"deptPersonId":"1",

         "sysDepartment":{"deptName":"人事"},

                     "sysPerson":{"personName":"张丽安"}

                    }

                   ]

           };

/

获取josn对象数据,是一层一层进行的。

/

/

js获取json元素中的子元素如deptName,personName

/

alert(jsonrows[0]sysDepartmentdeptName);

alert(jsonrows[0]sysPersonpersonName);

</script>

<%

//jsp获取json元素中的子元素如deptName,personName

//================

//使用 json_simplejar包 处理json字符

//然后获取json对象中的数据

//================

//声明JSON字符串

String json = "{\"tota\":11,"+

               "\"rows\":["+

                         "{\"deptPersonId\":\"1\","+

                        "\"sysDepartment\":{"+

                                           "\"deptName\":\"人事\"},"+

                                           "\"sysPerson\":{\"personName\":\"张丽安\"}"+

                                           "}"+

                       "]"+

              "}";

//===============================

// 最终的JSON字符如下:

//       {"total":11,

    //        "rows":[{"deptPersonId":"1",

//          "sysDepartment":{"deptName":"人事"},

    //                 "sysPerson":{"personName":"张丽安"}

    //                }

    //                ]

    //        }

//

// 注意查结构

//================================

//{"tota":11,"rows":[{"sysPerson":{"personName":"张丽安"},"sysDepartment":{"deptName":"人事"},"deptPersonId":"1"}]}

//将字符串转化为JSON对象

Object JSON = JSONValueparse(json);

//JSONObject继承自 HashMap

JSONObject JO = (JSONObject) JSON;

outprint(JSONtoString());

outprint("<br>");

//查看JSONObject对象元素长度

int length = JOsize();

outprint(length);

outprint("<br>");

outprint(JOtoString());

outprint("<br>");

//循环打印出元素数据

//for(int i = 0 ;i < length ; i++ ){

outprint("tota:<font color=red>" + JOget("tota") + "</font>");

outprint("<br>");

outprint("tota:<font color=red>" + JOget("rows") + "</font>");

outprint("<br>");

String rows = JOget("rows")toString();

//再次将rows对象转化为 JSONObject对象

JSONArray JO1 = (JSONArray) JSONValueparse(rows);

outprint(JO1size());

outprint("<br>");

JSONObject JO2 = (JSONObject)JO1get(0);

outprint("sysPerson:<font color=red>" + JO2get("sysPerson") + "</font>");

outprint("<br>");

outprint("sysDepartment:<font color=red>" + JO2get("sysDepartment") + "</font>");

outprint("<br>");

//再次获取

outprint("personName:<font color=red>" + ((JSONObject)JO2get("sysPerson"))get("personName") + "</font>");

outprint("<br>");

outprint("deptName:<font color=red>" + ((JSONObject)JO2get("sysDepartment"))get("deptName") + "</font>");

outprint("<br>");

//===================================

// 备注 信息

// JSONObject 可以转化为 {key:value}形式的 JSON对象,该对象继承自 HashMap ,所以可以使用HashMap的方法

// JSONArray  可以装维为 [object,object,……] 形式的数据对象,该对象继承自ArrayList,

// 灵活运用,可基本满足 需求。

//}

%>

</html>

你需要 下载 json_simple-11-allzip文件,网上搜索。

处理后如下:

以上就是关于Spring Boot使用@JsonProperty,@JsonIgnore,@JsonFormat注解全部的内容,包括:Spring Boot使用@JsonProperty,@JsonIgnore,@JsonFormat注解、json之jackson的注解@Jsonformat、@JSONField的ordinal与format属性使用与注意事项等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/web/9666404.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-30
下一篇2023-04-30

发表评论

登录后才能评论

评论列表(0条)

    保存