前言(可以略过)

  最近在开发一个智能电表的管理系统,与常规的面向业务的系统不同。智能电表特点是每30分钟会向服务器发一次请求,报道自己目前的电表情况。然后服务器根据电表情况统计此电表的电量使用情况,包括日,月,年。不同的小区还有不同的阶梯峰谷电计算策略。不同的缴费时间(需要根据缴费时间生成对应的订单)。并且电表初期预计有10w个,这样就又带来了高并发的问题。

  所以此系统主要难点就是实时电量的统计以及高并发。

  经过一系列的讨论,终于找到了解决方案:通过redis来对所有的电表数据进行缓存,然后一天进行一次持久化,这样的话就可以减少mysql的压力,但弊端就是redis的数据结构会比较复杂。

  正文(问题描述)

  在用redis存储获取数据时,发现从redis存入的json字符串无法使用jackson进行对象转换。一开始以为是jackson的使用问题,然后又是看谷歌又是看文档,发现都无法解决。最终debug发现了问题如下:

  当把一个对象转换成Json字符串存入redis中,然后再从redis取出时是这样的格式

要转换的对象
class A{
    int consumeStep=0;
    float totalAmount=0f;
}

从redis中取出后的数据格式:

"{\"consumeStep\":1,\"totalAmount\":0.0}"

可以发现,字符串进行了转义处理。

如果直接把转义的字符串显式赋值给一个变量,编译器会自动把转义字符去除,变成一个正常的json字符:

如果不是显式赋值的,那么原来的转义字符以及开头和结束的双引号都会存在

如果上面的格式想通过显式赋值,要怎么实现呢?需要把每一个转义字符再次转义如下:

String c="\"{\\\"consumeStep\\\":1,\\\"totalAmount\\\":0.0}\"";

那么问题也就解决了,因为不是显式赋值的原因,所以从redis中获取的json字符串会出现多余的双引号和转义字符,造成jackson无法识别解析,解决方法就是把多余的字符去掉:

str=str.substring(1, structureString.length()-1);//去掉开头和结尾的双引号
str=str.replace("\\", "");//去掉转义字符

暂时只能想到这个方法,有更牛方法的同学欢迎留言,一起学习,谢谢。

使用Redis和jackson操作json中遇到的坑的更多相关文章

  1. Java操作JSON数据(4,end)--Jackson操作JSON数据

    Jackson是SpringBoot默认使用的JSON处理库,它可以轻松的将Java对象转换成JSON对象,同样也可以将JSON转换成Java对象.本文介绍下Jackson的基本使用方法,包括序列化和 ...

  2. 使用jackson序列化json时遇到的坑

    公司使用Springboot进行开发,里面默认使用了jackson进行序列化. 但是序列化的过程中一直报错,因此记录一下. ⒈jackson默认大小写敏感,且首字母转小写 在类上添加一下注解即可 @J ...

  3. JSON相关知识,转载:删除JSON中数组删除操作

    一:JSON是什么 JSONg格式:对象是一个无序的“名称/值”对的集合. 对象以括号开始,括号结束. 名称冒号分隔值. "名称/值"之间用逗号分隔 例: var people = ...

  4. js中如何操作json数据

    一.要想熟练的操作json数据,就先要了解json数据的结构,json有两种结构:对象和数组. 1.对象 一个对象以“{”开始,“}”结束.每个“名称”后跟一个“:”:“‘名称/值’ 对”之间使用“, ...

  5. redis的hash操作在集中式session中的应用

    在集群部署时,为了高可用性的目的,往往把session进行共享,共享分为两种:session复制和集中式管理. redis在session集中式管理中可以起到比较大的作用. 制约session集中式共 ...

  6. Spring学习---Spring中利用jackson进行JSON转换

    Spring中利用jackson进行JSON转换 import java.util.List; import com.fasterxml.jackson.core.JsonProcessingExce ...

  7. JavaScript中使用JSON,即JS操作JSON总结

    JSON(JavaScript Object Notation 对象标记) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生 ...

  8. 在Springboot + Mybaitis-plus 项目中利用Jackson实现json对java多态的(反)序列化

    Jackson允许配置多态类型处理,当JSON面对的转换对象是一个接口.抽象类或者一个基类的时候,可以通过一定配置实现JSON的转换.在实际项目中,Controller层接收入参以及在Dao层将对象以 ...

  9. JS中操作JSON总结

    JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,是理想的数据交换格式.同时,JSON是 JavaScript 原生格式,这意 ...

随机推荐

  1. bzoj 1758: [Wc2010]重建计划

    Description Input 第 一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案 ...

  2. 学习rollup.js模块文件打包

    学习rollup.js模块文件打包 一:rollup 是什么?Rollup 是一个 JavaScript 模块打包器,可以将小块代码编译成大块复杂的代码. webpack 和 Rollup 对比不同点 ...

  3. c语言中的转义序列

    c中的输出函数printf()可以带以下的转义序列,不同的转义序列会得到不同的结果. 1.\a:警报 2.\b:退格(光标回退一格)3.\f:换页4.\n:换行(光标去到下一行的起始处)5.\r:回车 ...

  4. JAVA 用数组实现 ArrayList

    我们知道 ArrayList 是一个集合,它能存放各种不同类型的数据,而且其容量是自动增长的.那么它是怎么实现的呢? 其实 ArrayList 的底层是用 数组实现的.我们查看 JDK 源码也可以发现 ...

  5. 使用sed,grep 批量修改文件内容

    使用sed命令可以进行字符串的批量替换操作,以节省大量的时间及人力: 使用的格式如下: sed -i "s/oldstring/newstring/g" `grep oldstri ...

  6. spring中Bean后置处理器实现总结

    BeanPostProcessor接口 bean的后置处理器实现功能主要是 可以在bean初始化之前和之后做增强处理.自定义MyBeanProcessor实现BeanPostProcessor接口,重 ...

  7. vue2.0 vetur插件提示 'v-for' directives require 'v-bind:key' directives 的解决办法

    在用vscode编写vue代码时,因为安装的有vetur插件,所以当代码中有v-for语法时,会提示 [vue-language-server] 'v-for' directives require ...

  8. JAVA定时任务调度之Timer入门详解(一)

    所谓的Timer,打开jdk的api文档可以看到它的定义:一种工具,线程用其安排以后在后台线程中执行的任务.可安排任务执行一次,或者定期重复执行.通俗点讲就是说:有且仅有一个后台线程对多个业务线程进行 ...

  9. Android Studio 查看手机CPU信息

    在Android开发中,我们想要获取手机是什么CPU架构,可以通过下面方式: 1.进入adb 终端 adb shell 2.进入proc目录 cd /proc/ 3.查看cpu信息 cat cpuin ...

  10. SpringCloud学习笔记(4)——Zuul

    参考Spring Cloud官方文档第19章 19. Router and Filter: Zuul 路由是微服务架构的一部分.例如,"/"可能映射到你的web应用,"/ ...