fastjson 转下划线_Java开发里遇到的奇奇怪怪的需求---JSON键值驼峰转下划线的实现...
上周在与第三方对接接口的时候,由于三方的接口key值均是采用下划线命名的方式,使用传统的JSONObject方式,需要挨个赋值,特别麻烦,而且一点也不面向对象,一点也不极客。
大概实现的效果就是上图这样,三方接口提供的无论是入参还是接参,均是下划线分隔的,接口的需求是驼峰的和下划线分隔的均需要能正常接收,并进行业务逻辑处理,好了,话不多说,上代码!
代码见:jjn0942/jackson-demo-projectgitee.com
首先导入Pom依赖,Jackson的三个Jar包和FastJson(可不要,就是习惯了用而已):
com.fasterxml.jackson.core
jackson-core
2.12.0-rc1
com.fasterxml.jackson.core
jackson-annotations
2.12.0-rc1
com.fasterxml.jackson.core
jackson-databind
2.12.0-rc1
com.alibaba
fastjson
1.2.74
我们模拟用户注册的场景,提交一系列基本信息,如:
{
"user_name": "jjn",
"org_id": "01",
"org_name": "Class1",
"age": 0,
"email": "jjn@mail.ustc.edu.cn",
"create_time": "2020-11-01 09:11:03"
}
通过接口处理之后生成的数据如下:
{
"code": 200,
"message": "成功",
"info": {
"update_time": "2020-11-01 22:06:45",
"create_time": "2020-11-01 09:11:03",
"registerTime": "2020-11-01 22:06:45",
"user_name": "jjn",
"org_id": "01",
"registered": true,
"org_name": "Class1",
"age": 0,
"email": "jjn@mail.ustc.edu.cn"
}
}
那么是如何实现的呢?其实主要就是Jackson Json库的几个注解,来看看吧~@JsonProperty
/*** Marker annotation that can be used to define a non-static* method as a "setter" or "getter" for a logical property* (depending on its signature),* or non-static object field to be used (serialized, deserialized) as* a logical property.*
* Default value ("") indicates that the field name is used* as the property name without any modifications, but it* can be specified to non-empty value to specify different* name. Property name refers to name used externally, as* the field name in JSON objects.*
* Starting with Jackson 2.6 this annotation may also be* used to change serialization of Enum
like so:*
public enum MyEnum {{@literal @JsonProperty}("theFirstValue") THE_FIRST_VALUE,{@literal @JsonProperty}("another_value") ANOTHER_VALUE;}
* as an alternative to using {@link JsonValue} annotation.*/
注释里面写的很清楚了,指定了value的值之后,在生成JSON的时候,会按value的值来。@JsonAlias
/*** Annotation that can be used to define one or more alternative names for* a property, accepted during deserialization as alternative to the official* name. Alias information is also exposed during POJO introspection, but has* no effect during serialization where primary name is always used.*
* Examples:*
*public class Info {* @JsonAlias({ "n", "Name" })* public String name;*}*
** @since 2.9*/
alias的意思是别名,value值指定了之后,可以接受多种可能的赋值。
所以最后我们的用户实体类就会写成这样:
package com.zhihu.jjn.demoproject.entity;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.Date;
/*** @author Jiang Jining* @date 2020/11/1 10:17*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class User {
@JsonProperty(value = "user_name")
@JsonAlias(value = {"user_name", "userName"})
private String userName;
@JsonProperty(value = "org_id")
@JsonAlias(value = {"org_id", "orgId"})
private String orgId;
@JsonProperty(value = "org_name")
@JsonAlias(value = {"org_name", "orgName"})
private String orgName;
private Integer age;
private String email;
@JsonProperty(value = "create_time")
@JsonAlias(value = {"create_time", "createTime"})
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date createTime;
@JsonProperty(value = "update_time")
@JsonAlias(value = {"update_time", "updateTime"})
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date updateTime;
private Boolean registered;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date registerTime;
}
返回实体类:
package com.zhihu.jjn.demoproject.entity;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/*** @author Jiang Jining* @date 2020/11/1 11:08*/
@Data
@AllArgsConstructor
@Builder
@NoArgsConstructor
public class Response {
private Integer code;
private String message;
private JSONObject info;
public static Response success(JSONObject data) {
return Response.builder().code(200).message("成功").info(data).build();
}
public static Response error(JSONObject data) {
return Response.builder().code(500).message("失败").info(data).build();
}
}
service接口:
package com.zhihu.jjn.demoproject.service;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zhihu.jjn.demoproject.entity.User;
/*** @author Jiang Jining* @date 2020/11/1 11:12*/
public interface UserService {
/*** Register user demo.** @param user user param from front end* @return json object*/
JSONObject registerUser(User user) throws JsonProcessingException;
}
service接口实现:
package com.zhihu.jjn.demoproject.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.zhihu.jjn.demoproject.entity.User;
import com.zhihu.jjn.demoproject.service.UserService;
import org.springframework.stereotype.Service;
import java.util.Date;
/*** @author Jiang Jining* @date 2020/11/1 11:12*/
@Service
public class UserServiceImpl implements UserService {
@Override
public JSONObject registerUser(User user) throws JsonProcessingException {
ObjectMapper objectMapper = new ObjectMapper();
user.setRegistered(true);
user.setRegisterTime(new Date());
user.setUpdateTime(new Date());
String string = objectMapper.writeValueAsString(user);
return JSON.parseObject(string);
}
}
最后的Controller实现:
package com.zhihu.jjn.demoproject.controller;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.zhihu.jjn.demoproject.entity.Response;
import com.zhihu.jjn.demoproject.entity.User;
import com.zhihu.jjn.demoproject.service.UserService;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/*** @author Jiang Jining* @date 2020/11/1 11:06*/
@RestController
@CrossOrigin
public class UserController {
@Resource
private UserService userService;
@PostMapping(value = "/api/user/register")
public Response userRegisterController(@RequestBody User user) throws JsonProcessingException {
return Response.success(userService.registerUser(user));
}
}
fastjson 转下划线_Java开发里遇到的奇奇怪怪的需求---JSON键值驼峰转下划线的实现...相关推荐
- 安卓开发中遇到的奇奇怪怪的问题(三)
本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发. 距离上一篇 安卓开发中遇到的奇奇怪怪的问题(二)又过了半年了,转眼也到年底了,是时候拿出点干货了.这篇算是本年度个人印象最深的几 ...
- JSON字符串key值驼峰转下划线
起因 工作中需要解析特殊的JSON字符串,将JSON文本中所有的Map结构中的key的格式由驼峰转换为下划线.本着不重复造轮子的原则,我在网上搜索到了一些资料,都是下划线转驼峰的工具,没有驼峰转下划线 ...
- java: 程序包com.alibaba.fastjson不存在_Java开发中的异常
NO.1 Java.alng.NullPointerException 这个异常大家肯定都经常遇到,异常的解释是 "程序遇上了空指针 ",简单地说就是调用了未经初始化的对象或者是不 ...
- 关于微信小程序开发里,数据动态绑定,显示改变,值不改变的记录
先看带代码 let num1,num2,answer=1; Page({data:{answer:"",},getNum1(event){num1=event.detail.val ...
- java list键值_java基础之对List,Map,Set等集合键值对的简单认识
[一.集合] 特征: 数组:定长.可以放基本数据类型. List:变长.只能放对象.有序,可重复. Set :变长.只能放对象.无序,不可重复. Map :变长.只能放对象.无序,键值对. 重要实现类 ...
- springboot接口入参下划线转驼峰以及返回参数驼峰转下划线实现
转自:springboot接口入参下划线转驼峰以及返回参数驼峰转下划线实现 - 李东平|一线码农 - 博客园 (cnblogs.com) 1.背景 在实际开发中,通常来说java里面是使用驼峰的命名规 ...
- java iterator如何知道数量_Java开发岗面试题基础篇(二)
点击蓝字 关注wo们 老哥们,接上篇<Java开发岗面试题--基础篇(一)>,本期推出Java开发岗面试题--基础篇(二),来看看Java中的集合.多线程.异常体系等知识在面试中是怎么体现 ...
- iOS开发里面的4个层次
iOS开发里面的4个层次 ios开发具体体现为4个层次,你可以看我下面的思维导图. Media 虽然是媒体层了,然而还是和硬件比较接近. Core OS 主要是mach 4.x BSD UNIX 内核 ...
- 在线下划线转驼峰,驼峰转下划线工具
在线下划线转驼峰,驼峰转下划线工具 在线下划线转驼峰,驼峰转下划线工具 本工具可以将字符串下划线转为驼峰,或驼峰转下划线,纯客户端计算. 骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程 ...
最新文章
- 解决Windows Git Bash中文乱码问题
- 基于音乐的脑机接口——采访Stefan Ehrlich 和 Kat Agres(上)
- from . import _arpack ImportError: DLL load failed
- 一种简单又有效的设置虚拟机网络的方法
- python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程
- 随机猜拳判断胜利(思路,逻辑正确不完美)if switch
- 最优化理论与方法(part5)--函数和微分
- 使用神经网络进行稀疏采样_使用python+opencv进行神经网络迁移
- VS2010如何在编辑器自动换行
- mooon db wrapper
- autoit选中图标无反应_ps图标教学,使用小技巧。
- 山大网络计算机基础知识模拟,山大网络教育计算机系统结构模拟试卷1
- 奥运门票系统down机的技术问题
- SVACH264AVS标准的去块滤波比较
- 数据类型之列表与元组
- 胡阳pyhton作业题--20150725
- ios截屏功能html,滚动截屏APP - iPhone上的长截图工具
- 基于单片机的运动监测控制系统设计
- 349. 两个数组的交集
- 创建CSDN虚拟大学
热门文章
- Java每天10道面试题,跟我走,offer有!(十)
- 带你学MySQL系列 | “存储过程”学不会,那是你没有看这篇文章!
- 青海vr消防模拟演练系统,满足了对多人群多场景下的培训需求
- static(静态方法中)如何调用非静态方法?
- 线程【3】- 多线程中PTHREAD_MUTEX_RECURSIVE的理解
- 10分钟上手pythonpandas_10分钟学pandas(10 Minutes to pandas)-全文翻译
- 三年级信息技术用计算机娱乐,“第5课 用计算机娱乐”教学设计
- UI设计师—这个世界上最棒的工作!
- c语言第一行include,[C语言]为什么要有include?——从Hello World说起
- 武汉理工大学博士生导师计算机,博士学位论文预答辩公告-武汉理工大学计算机学院.DOC...