上周在与第三方对接接口的时候,由于三方的接口key值均是采用下划线命名的方式,使用传统的JSONObject方式,需要挨个赋值,特别麻烦,而且一点也不面向对象,一点也不极客。

大概实现的效果就是上图这样,三方接口提供的无论是入参还是接参,均是下划线分隔的,接口的需求是驼峰的和下划线分隔的均需要能正常接收,并进行业务逻辑处理,好了,话不多说,上代码!

代码见:jjn0942/jackson-demo-project​gitee.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键值驼峰转下划线的实现...相关推荐

  1. 安卓开发中遇到的奇奇怪怪的问题(三)

    本文已授权微信公众号:鸿洋(hongyangAndroid)原创首发. 距离上一篇 安卓开发中遇到的奇奇怪怪的问题(二)又过了半年了,转眼也到年底了,是时候拿出点干货了.这篇算是本年度个人印象最深的几 ...

  2. JSON字符串key值驼峰转下划线

    起因 工作中需要解析特殊的JSON字符串,将JSON文本中所有的Map结构中的key的格式由驼峰转换为下划线.本着不重复造轮子的原则,我在网上搜索到了一些资料,都是下划线转驼峰的工具,没有驼峰转下划线 ...

  3. java: 程序包com.alibaba.fastjson不存在_Java开发中的异常

    NO.1 Java.alng.NullPointerException 这个异常大家肯定都经常遇到,异常的解释是 "程序遇上了空指针 ",简单地说就是调用了未经初始化的对象或者是不 ...

  4. 关于微信小程序开发里,数据动态绑定,显示改变,值不改变的记录

    先看带代码 let num1,num2,answer=1; Page({data:{answer:"",},getNum1(event){num1=event.detail.val ...

  5. java list键值_java基础之对List,Map,Set等集合键值对的简单认识

    [一.集合] 特征: 数组:定长.可以放基本数据类型. List:变长.只能放对象.有序,可重复. Set :变长.只能放对象.无序,不可重复. Map :变长.只能放对象.无序,键值对. 重要实现类 ...

  6. springboot接口入参下划线转驼峰以及返回参数驼峰转下划线实现

    转自:springboot接口入参下划线转驼峰以及返回参数驼峰转下划线实现 - 李东平|一线码农 - 博客园 (cnblogs.com) 1.背景 在实际开发中,通常来说java里面是使用驼峰的命名规 ...

  7. java iterator如何知道数量_Java开发岗面试题基础篇(二)

    点击蓝字 关注wo们 老哥们,接上篇<Java开发岗面试题--基础篇(一)>,本期推出Java开发岗面试题--基础篇(二),来看看Java中的集合.多线程.异常体系等知识在面试中是怎么体现 ...

  8. iOS开发里面的4个层次

    iOS开发里面的4个层次 ios开发具体体现为4个层次,你可以看我下面的思维导图. Media 虽然是媒体层了,然而还是和硬件比较接近. Core OS 主要是mach 4.x BSD UNIX 内核 ...

  9. 在线下划线转驼峰,驼峰转下划线工具

    在线下划线转驼峰,驼峰转下划线工具 在线下划线转驼峰,驼峰转下划线工具 本工具可以将字符串下划线转为驼峰,或驼峰转下划线,纯客户端计算. 骆驼式命名法(Camel-Case)又称驼峰式命名法,是电脑程 ...

最新文章

  1. 解决Windows Git Bash中文乱码问题
  2. 基于音乐的脑机接口——采访Stefan Ehrlich 和 Kat Agres(上)
  3. from . import _arpack ImportError: DLL load failed
  4. 一种简单又有效的设置虚拟机网络的方法
  5. python16进制字节序_第 1 章 套接字、IPv4和简单的客户端/服务器编程
  6. 随机猜拳判断胜利(思路,逻辑正确不完美)if switch
  7. 最优化理论与方法(part5)--函数和微分
  8. 使用神经网络进行稀疏采样_使用python+opencv进行神经网络迁移
  9. VS2010如何在编辑器自动换行
  10. mooon db wrapper
  11. autoit选中图标无反应_ps图标教学,使用小技巧。
  12. 山大网络计算机基础知识模拟,山大网络教育计算机系统结构模拟试卷1
  13. 奥运门票系统down机的技术问题
  14. SVACH264AVS标准的去块滤波比较
  15. 数据类型之列表与元组
  16. 胡阳pyhton作业题--20150725
  17. ios截屏功能html,滚动截屏APP - iPhone上的长截图工具
  18. 基于单片机的运动监测控制系统设计
  19. 349. 两个数组的交集
  20. 创建CSDN虚拟大学

热门文章

  1. Java每天10道面试题,跟我走,offer有!(十)
  2. 带你学MySQL系列 | “存储过程”学不会,那是你没有看这篇文章!
  3. 青海vr消防模拟演练系统,满足了对多人群多场景下的培训需求
  4. static(静态方法中)如何调用非静态方法?
  5. 线程【3】- 多线程中PTHREAD_MUTEX_RECURSIVE的理解
  6. 10分钟上手pythonpandas_10分钟学pandas(10 Minutes to pandas)-全文翻译
  7. 三年级信息技术用计算机娱乐,“第5课 用计算机娱乐”教学设计
  8. UI设计师—这个世界上最棒的工作!
  9. c语言第一行include,[C语言]为什么要有include?——从Hello World说起
  10. 武汉理工大学博士生导师计算机,博士学位论文预答辩公告-武汉理工大学计算机学院.DOC...