ObjectMapper

Json字符串与Object对象相互转换的几种方式

一世执手 提交于 2020-04-17 02:21:53
【推荐阅读】微服务还能火多久?>>> Json-Lib、Org.Json、Jackson、Gson、FastJson五种方式转换json类型 只列举了最省事的方式。不涉及复制情况和速度。 测试用例,一个User类,属性name,age,location。重写toString()。 public class User { private String name; private Integer age; private String location; public User() { } public User(String name) { this.name = name; } public User(String name, Integer age) { this.name = name; this.age = age; } public User(String name, Integer age, String location) { this.name = name; this.age = age; this.location = location; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Integer

Java的Long值传递到前端精度丢失问题

孤街醉人 提交于 2020-04-12 15:14:00
JavaScript 无法处理 Java 的长整型 Long, 从而导致精度丢失,具体表现为主键最后两位永远为 0,解决思路: Long 转为 String 返回就可以完美的解决了. Java序列化JSON时long型数值,会出现精度丢失的问题。 我们用的是阿里巴巴的fastjson, 版本1.2.47 原因: java中得long能表示的范围比js中number大,也就意味着部分数值在js中存不下(变成不准确的值). 解决办法一: 使用ToStringSerializer的注解,让系统序列化时,保留相关精度 @JsonSerialize(using=ToStringSerializer.class) private Long id; 上述方法需要在每个对象都配上该注解,此方法过于繁锁。 解决办法(二): 使用全局配置,将转换时实现自动ToStringSerializer序列化 Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { MappingJackson2HttpMessageConverter jackson2HttpMessageConverter = new MappingJackson2HttpMessageConverter();

Springboot单例模式实战封装json转换

时光怂恿深爱的人放手 提交于 2020-04-11 07:33:01
一、定义 保证一个类仅有一个实例,并提供一个全局访问点. 二、优点 (1)在内存里只有一个实例,减少了内存开销 (2)可以避免对资源的多重占用 (3)设置全局访问点,严格控制访问 (对外不会new出来,只能通过这个方法创建对象) 三、缺点 没有接口,扩展困难. 四、举例实现,实际中常用 封装成 转换json的类,传入一个对象,转换为json形式,就可以封装成一个util 最好的实现方式是枚举的实现方式。 一、枚举的实现方式: 1 @Slf4j 2 public enum EnumJacksonUtil { 3 4 /** 5 * 方法集合 6 */ 7 INSTANCE { 8 9 /** 10 * 转成json 11 * @param object 传入的实体类 12 * @return 13 */ 14 @Override 15 public String toJsonString(Object object) { 16 String json = null ; 17 if (! StringUtils.isEmpty(object)) { 18 try { 19 log.info("传入对象:" + object); 20 json = mapper.writeValueAsString(object); 21 log.info("转换结果:" + json); 22 }

接口限流

旧城冷巷雨未停 提交于 2020-04-05 15:44:30
接口限流看这一篇就够了!!! 导读 前几天和一个朋友讨论了他们公司的系统问题,传统的单体应用,集群部署,他说近期服务的并发量可能会出现瞬时增加的风险,虽然部署了集群,但是通过压测后发现请求延迟仍然是很大,想问问我有什么改进的地方。我沉思了一会,现在去改架构显然是不可能的,于是我给出了一个建议,让他去做个接口限流,这样能够保证瞬时并发量飙高也不会出现请求延迟的问题,用户的体验度也会上去。 至于什么是接口限流?怎么实现接口限流?如何实现单机应用的限流?如何实现分布式应用的限流?本篇文章将会详细阐述。 限流的常见几种算法 常见的限流算法有很多,但是最常用的算法无非以下四种。 固定窗口计数器 固定算法的概念如下 将时间划分为多个窗口 在每个窗口内每有一次请求就将计数器加一 如果计数器超过了限制数量,则本窗口内所有的请求都被丢弃当时间到达下一个窗口时,计数器重置。 固定窗口计数器是最为简单的算法,但这个算法有时会让通过请求量允许为限制的两倍。考虑如下情况:限制 1 秒内最多通过 5 个请求,在第一个窗口的最后半秒内通过了 5 个请求,第二个窗口的前半秒内又通过了 5 个请求。这样看来就是在 1 秒内通过了 10 个请求。 滑动窗口计数器 滑动窗口计数器算法概念如下: 将时间划分为多个区间; 在每个区间内每有一次请求就将计数器加一维持一个时间窗口,占据多个区间; 每经过一个区间的时间

Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能

▼魔方 西西 提交于 2020-03-25 23:37:26
3 月,跳不动了?>>> Spring Boot 整合 Redis 和 JavaMailSender 实现邮箱注册功能 开篇 现在的网站基本都有邮件注册功能,毕竟可以通过邮件定期的给用户发送一些 垃圾邮件 精选推荐😂😂。 回到正题,首先我们得清楚一下几点 ==邮件注册需要什么信息?== ​ 最基本的: 邮箱地址 、 密码 、 验证码 ==这些信息放在什么位置?== ​ 邮箱地址和密码没得说,以后会频繁使用,都得放到 MySQL 中,验证码呢,如果也放到 MySQL 还得给它新建一个字段,但注册后就不用了,这时候,redis 就可以很好的解决这个问题,而且 redis 还可以设置过期时间,各种数据类型也非常方便。 ==如何发送邮件?== ​ Spring Boot 整合了 JavaMailSender,导入 jar包即可使用,非常的方便 基本流程 点击发送邮件,后台生成一个随机验证码存入redis中,设置有效期5分钟 点击注册,拿用户输入的验证码和redis中的验证码比较是否一致 代码实现 只贴出核心代码,如果需要请前往我的 Github 查看 邮件服务器: 邮件服务器地址大全 导入 Maven 依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter

Can not deserialize value of type java.util.Date from String异常解决办法

纵饮孤独 提交于 2020-03-23 10:54:55
3 月,跳不动了?>>> 添加webConfigurer类 类中实现WebMvcConfigurer接口中的extendMessageConverters接口 1、初始化一个Jackson2Http消息转换器类(MappingJackson2HttpMessageConverter) 2、初始化一个ObjectMapper对象 3、将objectMapper赋值到mappingJackson2HttpMessageConverter中的ObjectMapper中,如果要自定义格式,可以先使用ObjectMapper.setDateFormat方法,自定义日期格式 4、设置中文编码,初始化一个MediaType列表List<MediaType> list = new ArrayList<>() 5、list.add(MediaType.APPLICATION_JSON_UTF8) 6、mappingJave2HttpMessageConverter.setSupportedMediatypes(list) 7、converters.add(mappingJave2HttpMessageConverter) 具体代码如下: import com.fasterxml.jackson.databind.ObjectMapper; import org.springframework

我应该将Jackson的ObjectMapper声明为静态字段吗?

我的未来我决定 提交于 2020-03-07 19:11:16
Jackson库的 ObjectMapper 类 似乎是线程安全的 。 这是否意味着我应该像这样将我的 ObjectMapper 声明为静态字段? class Me { private static final ObjectMapper mapper = new ObjectMapper(); } 而不是像这样的实例级字段? class Me { private final ObjectMapper mapper = new ObjectMapper(); } #1楼 尽管就线程安全而言,声明静态ObjectMapper是安全的,但是您应该意识到,在Java中构造静态Object变量被认为是不好的做法。 有关更多详细信息,请参见 为什么将静态变量视为邪恶? (如果您愿意, 我的回答 ) 简而言之,应避免使用静态方法,因为这样会使编写简洁的单元测试变得困难。 例如,对于静态最终ObjectMapper,您无法将JSON序列化换成虚拟代码或无操作。 另外,静态的final阻止您在运行时重新配置ObjectMapper。 您可能现在没有想到这样做的原因,但是如果您将自己锁定在静态的最终模式中,那么只需拆除类加载器,就可以重新初始化它。 在使用ObjectMapper的情况下,它很好,但总的来说,这是一种不好的做法,并且使用单例模式或控制反转来管理您的长期对象没有任何优势。 #2楼

RedisTemplate系列化器之GenericJackson2JsonRedisSerializer

笑着哭i 提交于 2020-03-05 22:14:50
javaBean存进去,出来给我个LinkedHashMap 时, 注意修改自定义ObjectMapper, 要么不自定义ObjectMapper 如果自定义记得设置: objectMapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY); 其余,看原文文 Redis作为高速缓存数据库,目前应用非常广泛。RedisTemplate是Spring提供用于操作redis数据库的一个类。 将数据存放到Redis中,以及数据读取。这里必然涉及到数据的系列化和反系列化。RedisTemplate默认的系列化类是JdkSerializationRedisSerializer,用JdkSerializationRedisSerializer序列化的话,被序列化的对象必须实现Serializable接口。在存储内容时,除了属性的内容外还存了其它内容在里面,总长度长,且不容易阅读。 我们要求是存储的数据可以方便查看,也方便反系列化,方便读取数据。 JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer,两者都能系列化成json,但是后者会在json中加入@class属性,类的全路径包名,方便反系列化

ObjectMapper changes Date to String

↘锁芯ラ 提交于 2020-03-05 05:02:20
问题 I am trying to use Jackson ObjectMappper to convert my Java POJO to Map. But, on converting, the Date changes to String. This is my POJO: public class Sample { @Id private String id; private Date date; public String getId() { return id; } public void setId(String id) { this.id = id; } public Date getDate() { return date; } public void setDate(Date date) { this.date = date; } } Here is my code: @Test public void testGenMap() { Sample sample = new Sample(); sample.setId("a"); sample.setDate(new

【Java Web_13】Ajax、Json

橙三吉。 提交于 2020-02-26 19:20:00
一、Ajax 1. $.ajax() * 语法:$.ajax({键值对}); //使用$.ajax()发送异步请求 $.ajax({ url:"ajaxServlet1111" , // 请求路径 type:"POST" , //请求方式 //data: "username=jack&age=23",//请求参数 data:{"username":"jack","age":23}, success:function (data) { alert(data); },//响应成功后的回调函数 error:function () { alert("出错啦...") },//表示如果请求响应出现错误,会执行的回调函数 dataType:"text"//设置接受到的响应数据的格式 }); 2. $.get():发送get请求 * 语法:$.get(url, [data], [callback], [type]) * 参数: * url:请求路径 * data:请求参数 * callback:回调函数 * type:响应结果的类型 3. $.post():发送post请求 * 语法:$.post(url, [data], [callback], [type]) * 参数: * url:请求路径 * data:请求参数 * callback:回调函数 * type:响应结果的类型 二、json