fastjson自定义字段命名规则

2023-11-11

文章首发于个人博客,欢迎访问关注:https://www.lin2j.tech

前置知识

fastjson 在将对象转变为 JSON 字符串时,字段默认使用 CamelCase 规则命名。

在1.2.15版本之后,fastjson 支持配置 PropertyNamingStrategy,支持四种策略: CamelCase、PascalCase、SnakeCase和KebabCase。

属性名策略说明:

CamelCase策略,Java对象属性:userName,序列化后属性:userName;

PascalCase策略,Java对象属性:userName,序列化后属性:UserName;

SnakeCase策略,Java对象属性:userName,序列化后属性:user_name;

KebabCase策略,Java对象属性:userName,序列化后属性:user-name。

我的问题

公司规定 ElasticSearch 上索引的键需要使用大写字母表示,比如 USER_NAME,所以现在的规则没办法满足我的要求。

一开始想看一下是否可以实现什么接口来达到目的,但是发现 PropertyNamingStrategy 是个枚举类,无法继承。

解决办法

方法一:

将对象转变为 BeanMap 对象,遍历所有的字段,将字段转变为下划线大写的形式。

下面给出关键代码。

import org.springframework.cglib.beans.BeanMap;

/**
 * 将对象转变为以字段为键,字段值为值的哈希表,并且字段名变为下划线大写的形式
 */
public static <T> Map<String, Object> beanToMap(T bean) {
    Map<String, Object> map = Maps.newHashMap();
    if (bean != null) {
        BeanMap beanMap = BeanMap.create(bean);
        for (Object key : beanMap.keySet()) {
            map.put(StrUtil.camelToUnderscore(key.toString()), beanMap.get(key));
        }
    }
    return map;
}

/**
 * 将驼峰式命名的字符串转换为下划线大写方式。如果转换前的驼峰式命名的字符串为空,则返回空字符串。
 * 例如:HelloWorld->HELLO_WORLD
 *
 * @param name 转换前的驼峰式命名的字符串
 * @return 转换后下划线大写方式命名的字符串
 */
public static String camelToUnderscore(String name) {
    StringBuilder result = new StringBuilder();
    if (name != null && name.length() > 0) {
        // 将第一个字符处理成大写
        result.append(name.substring(0, 1).toUpperCase());
        // 循环处理其余字符
        for (int i = 1; i < name.length(); i++) {
            String s = name.substring(i, i + 1);
            // 在大写字母前添加下划线
            if (s.equals(s.toUpperCase()) && !Character.isDigit(s.charAt(0))) {
                result.append("_");
            }
            // 其他字符直接转成大写
            result.append(s.toUpperCase());
        }
    }
    return result.toString();
}

最后通过下面的代码可以将对象发送到 es 进行保存。

IndexRequest request = new IndexRequest(esIndex);
String infoId = StringUtil.toString(t.getInfoId());
request.routing(infoId).source(BeanMapUtil.beanToEsMap(t)).id(infoId);

方法二

使用 @JsonField 的 name 属性,在 name 中直接指定命名规则,可以直接得到想要的 JSON 字符串。

下面给出代码示例。

/**
 * @author linjinjia
 * @date 2021/8/23 20:09
 */
public class FastJsonTest {

    public static void main(String[] args) {
        System.out.println(JSON.toJSONString(new User("lin2j", 24)));
        User user = JSON.parseObject("{\"AGE\":24,\"USER_NAME\":\"lin2j\"}", User.class);
        System.out.println(user);
    }

    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    static class User {
        @JSONField(name = "USER_NAME")
        private String userName;

        @JSONField(name = "AGE")
        private Integer age;
    }
}

输出结果为:

{"AGE":24,"USER_NAME":"lin2j"}
FastJsonTest.User(userName=lin2j, age=24)

这种方式也能满足我的要求。

对比

方法一和方法二都能满足我的要求,但是方法一并不是通过 fastjson 来实现目的的,也会显得麻烦一些。

我比较喜欢使用方法二,因为不用写那么多工具类。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

fastjson自定义字段命名规则 的相关文章

  • 将嵌套字典键值转换为 pyspark 数据帧

    我有一个 Pyspark 数据框 如下所示 我想提取 dic 列中的那些嵌套字典并将它们转换为 PySpark 数据帧 像这样 请让我知道如何实现这一目标 Thanks from pyspark sql import functions a
  • 如何使用 jq 从多个嵌套数组中提取键

    SETUP 我试图弄清楚 jq 过滤器是如何工作的 但在找出嵌套数组时遇到了困难 使用下面的数据我无法做出平的 5 键输出 我可以得到 1 个键和 4 个空值 或者 4 个键和 1 个空值 但不能得到所有 5 个键 1 个键 4 个空值 R
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 发送 POST 请求时 JSON 原语无效

    我有以下 ajax 请求 其中我尝试将 JSON 对象发送到服务器 function sendData subscriptionJson ajax type POST url Url Action SubscribeSecurities S
  • 使用 Newtonsoft.Json.NET 搜索 JSON 根对象的正确 JsonPath 表达式是什么?

    大多数例子涉及Stefan G ssner 的书店示例 http goessner net articles JsonPath index html e3 但是我正在努力为简单对象 无数组 定义正确的 JsonPath 表达式 Id 1 N
  • SQL查询json字典数据

    我的表中的 CLOB 字段包含 JSON 如下所示 a value1 b value2 c value3 我正在尝试编写一个 SQL 查询来返回一个包含键和值字段的表 如下所示 key value a value1 b value2 c v
  • 如何在 Swift 3 中解析 JSON 数组 [重复]

    这个问题在这里已经有答案了 我从 Socket 获取了一些我想访问的数据 但收到错误消息 指出每次都无法将 NSArray 转换为 NSDictionary struct SocketEventHandler let event Strin
  • JSON 解析错误:需要“STRING”

    我在用JSONLint http jsonlint com 解析一些 JSON 我不断收到错误 错误 第 1 行解析错误 产品 需要 STRING 却得到 未定义 这是代码 product code Abc123 description S
  • CodeIgniter 控制器 - JSON - AJAX

    我正在尝试通过 AJAX 使用 CodeIgniter 发送表单构建 并尝试使用 JSON 获取响应 但是 我只在打开开发人员选项卡时看到响应 我什至不确定这是否实际上是响应 因为它显示了两个 json 数据 它所显示的只是加载旋转器 然后
  • 键绑定 - 鼠标中键与 Sublime Text 2

    有谁知道是否可以将鼠标中键绑定到 Sublime Text 2 中的操作 我知道可以进行一些鼠标交互 因为您可以使用后退和前进按钮 基本上 我将使用此按钮通过 sFTP 插件上传文件 这样我需要按下的按钮数量就会从 3 个减少到 1 个 目
  • shell-out 值到 md5(加密)函数

    我正在寻找一种解决方案 我正在构建 JSON 记录 并需要在 JQ 中生成一些文本 但将此文本通过管道传输到 MD5 求和函数并将其用作键的值 echo first John last Big jq id first last md5 通过
  • 使用 urllib2 从 FlightRadar24 获取数据时出现问题

    我正在尝试使用下面的脚本从 FlightRadar24 获取数据 基于这个答案 https stackoverflow com a 526695 3904031来处理cookies 当我当前在浏览器中输入该 url 时 我会得到一个不错的长
  • 将 OpenCV Mat 转换为数组(可能是 NSArray)

    我的 C C 技能很生疏 OpenCV 的文档也相当晦涩难懂 有没有办法获得cv Mat data属性转换为数组 NSArray 我想将其序列化为 JSON 我知道我可以使用 FileStorage 实用程序转换为 YAML XML 但这不
  • 列出 JSON 的所有键和值

    假设我有一些如下所示的 JSON items item id 0001 type donut name Cake ppu 0 55 batters batter
  • angularjs - 将对象数组(JSON 数据)发布到 PHP 页面

    我的 JSON 数据的示例如下 scope a email keval gmail permissions upload 1 edit 1 email new aa permissions upload 1 edit 1 我想发布同样的内容
  • 在 shell 中处理 json 时,例如使用curl,如何正确地将多个 jq 语句链接在一起?

    我是 jq 新手 所以如果这不是 jq 问题或 json 问题 请为我指出正确的方向 我不确定正确的术语 因此我很难正确地阐明问题 我正在使用curl 来提取一些json 我想过滤掉具有特定值的键 以下是一些示例 json id 593f4
  • Ajax调用完成后执行函数

    我是 Ajax 新手 我尝试在使用 for 循环时使用 Ajax Ajax 调用之后 我正在运行一个使用 Ajax 调用中创建的变量的函数 该函数只执行两次 我认为 Ajax 调用可能没有足够的时间在循环开始之前进行调用 有没有办法在运行
  • Jackson Kotlin - 反序列化 JsonNode

    Problem 我有字符串形式的 JSON 内容 我首先想用 Jackson 以编程方式遍历它 然后 当我有感兴趣的节点时 我想反序列化它 我尝试过的 我已使用 mapper readValue 成功反序列化字符串 但现在我想在 jsonN
  • PHP Json_encode 将空格更改为加号 +

    我有一个网络应用程序 我首先将 JSON 数据存储在 cookie 中 然后每 x 秒保存到数据库 它只是打开与服务器的连接 服务器读取 cookie 它实际上并不通过 POST 或 GET 发送任何内容 当我保存到 cookie 时 我的
  • 如何为 json 请求对象指定可选元素

    在 API 蓝图中 我希望为 POST 消息指定一个可选的 json 元素 示例 Add a new User POST To add a User send a JSON Request application json name A n

随机推荐

  • best ajax lib,BEST Currency Converter

    想提升客户的购物体验 以当地货币显示价格可以省去他们很多不必要的时间 也能提升客户与平台的粘度 该插件具备如下优势 1 轻松添加多种货币 按下按钮即可添加160多种货币 像专业人士一样开始国际销售 并鼓励客户购买 2 自动转换价格 价格会根
  • node.js 读取文件的时候 cmd执行脚本,中文(汉字)打印不出来

    node js 读取文件的时候 cmd执行脚本 中文 汉字 打印不出来 文本详情 输出结果 问题原因 txt编码格式不是UTF 8 解决办法 打开TXT文件 点击 文件 gt 另存为 gt 编码改为UTF 8 保存替换 问题解决
  • 【大数据】Flink 详解(五):核心篇 Ⅳ

    本系列包含 大数据 Flink 详解 一 基础篇 大数据 Flink 详解 二 核心篇 大数据 Flink 详解 三 核心篇 大数据 Flink 详解 四 核心篇 大数据 Flink 详解 五 核心篇 大数据 Flink 详解 六 源码篇
  • 通俗易懂的教你编写自己的webpack loader与plugin

    前言 webpack几乎是目前前端开发者无人不知的打包框架 毕竟无论使用什么开发库 都会想到要使用webpack打包 包括各种脚手架cli工具 大部分也采用了webpack作为其打包工具 本文试图用最简单的代码 仅仅使用命令行工具 代码足够
  • spring data jpa使用limit时,抛QuerySyntaxException unexpected token: limit

    异常重现 jpql语句如下 select g from Entity g where g codeUrl codeUrl ORDER BY g createTime DESC limit 1异常原因 limit是特定于某些数据库 例如 my
  • IDEA设置为中文

    按照如下步骤操作即可 下载对应的语言包 中文语言包下载地址 注意此处下载的版本只能是IDEA版本之前的语言包 下载之后的会报错 将下载好的jar包 放在IDEA目录下的lib目录下 点击File Settings 点击Plugins 然后点
  • matlab相关性分析(皮尔逊,肯德尔,斯皮尔曼)

    代码 clc clear load CRO C3 mat data GPP DT VUT REF EVI NDVI NIRv kNDVI LSWI FPAR TA F VPD F SW IN F rho corr data type pea
  • LeetCode题目笔记——1658. 将 x 减到 0 的最小操作数

    文章目录 题目描述 题目难度 中等 方法一 反向思考 双指针求最长子数组 代码 Python 代码 C 方法二 滑动窗口 代码 总结 我把这篇也归到面试题那一栏 因为觉得这题的思路和思考方式还挺好的 或许能用到其他题上 题目描述 给你一个整
  • [创业之路-74] - 感悟 - 创业是所有因素的机缘组合,缺一不可; 舰船思维 VS 城堡思维.

    感悟 方向 趋势 路径 资助 船只 船长 大副 水手 船员 装备 配套 路径 一个都不能少 只看对方向与趋势 一样葬身在趋势的洪流中 看不对方向与趋势 亦会老死在寂寞孤冷之中 在所有因素中 船只 装配 配套是最表象和最容易触发感官体验的 目
  • 服务器与虚拟技术,云服务器与虚拟化服务器的区别

    虚拟化服务器是让一台服务器变成几台甚至上百台相互隔离的虚拟服务器 不再受限于物理上的界限 而是让CPU 内存 磁盘 I O等硬件变成可以动态管理的 资源池 从而提高资源的利用率 简化系统管理 服务器虚拟化的种类 主要有 一虚多 多虚一 和
  • c++ 之 shared_ptr

    shared ptr shared ptr 是一种智能指针 smart pointer 作用有如同指针 但会记录有多少个 shared ptrs 共同指向一个对象 这便是所谓的引用计数 reference counting 一旦最后一个这样
  • oracle字符串生成唯一数字,在C#中生成唯一的字符串和数字【GUID】转

    当我们想要获得一个唯一的key的时候 通常会想到GUID 这个key非常的长 虽然我们在很多情况下这并不是个问题 但是当我们需要将这个36个字符的字符串放在URL中时 会使的URL非常的丑陋 想要缩短GUID的长度而不牺牲它的唯一性是不可能
  • Spark常见错误剖析与应对策略

    问题一 日志中出现 org apache spark shuffle MetadataFetchFailedException Missing an output location for shuffle 0 原因分析 shuffle分为s
  • 第2章 PyTorch基础(1/2)

    第2章 PyTorch基础 PyTorch是Facebook团队于2017年1月发布的一个深度学习框架 虽然晚于TensorFlow Keras等框架 但自发布之日起 其关注度就在不断上升 目前在GitHub上的热度已超过Theano Ca
  • iterator 怎么使用甀_Iterator的理解和使用

    es6成员之一的Iterator 遍历器 Iterator 它是一种接口 为各种不同的数据结构提供统一的访问机制 任何数据结构只要部署Iterator接口 就可以完成遍历操作 即依次处理该数据结构的所有成员 Iterator 的作用有三个
  • 记一次edusrc的漏洞挖掘

    一 前言 在fofa上闲逛的时候发现这个系统 其实之前也碰到过这个系统 当时可能觉得没什么漏洞点就没有管 正好闲着没事又碰到了这个系统 然后就拿过来简单的测试了一下 二 漏洞挖掘 1 信息收集 由于我是在fofa上发现的这个系统 所以也谈不
  • 软件系统设计-15-架构设计

    1 设计架构 Design Architecture 1 1 设计策略 Design Strategies Abstraction Generate Test Decomposition Reusable Elements Iteratio
  • python(数据分析)第5天:图例

    图例 plt legend import matplotlib pyplot as plt import random import matplotlib from matplotlib import cycler from matplot
  • Kafka练习

    需求 写一个生产者 不断的去生产用户行为数据 写入到kafka的一个topic中 生产的数据格式 造数据 guid 1 eventId pageview timestamp 1637868346789 isNew 1 guid 1 even
  • fastjson自定义字段命名规则

    文章首发于个人博客 欢迎访问关注 https www lin2j tech 前置知识 fastjson 在将对象转变为 JSON 字符串时 字段默认使用 CamelCase 规则命名 在1 2 15版本之后 fastjson 支持配置 Pr