记一次通过Java从redis中获取json数据中的中文乱码问题的解决

        今天做公司项目的时候遇到的问题,项目是由多个模块组成的,我负责的模块是用Java语言开发的,其他同事负责的模块是通过C#、C++等语言开发的,各个模块之间通过共用的 redis 的列表进行数据传输,数据的格式是提前约定好的json格式的数据。

        问题:我开发的模块,引用了 jedis 客户端的依赖,用来处理redis的相关操作。结果发现从约定的列表中 rpop 获取到的 json 中中文乱码。具体效果如下:

{

"uuid": "6a4640bf-2081-4e2a-9b63-11a03dfaae8f",

"request": "{\"uuid\":\"9e7eafdsdf-fsdfsd-fdfs4\",\"type\":\"STATUS_REPORT\",\"device_class\":\"RFID\",\"err_cod\":\"OK\",\"err_str\":\"\",\"data\":[{\"device_id\":\"XXXxxdfsdxxxxx\",\"status\":\"ERR_NETWORK\",\"status_str\":\"�������ӹ���\"},{\"device_id\":\"88f9f630babdb5d1\",\"status\":\"ERR_NETWORK\",\"status_str\":\"�������ӹ���\"},{\"device_id\":\"XXXxxxxxxx\",\"status\":\"ERR_NETWORK\",\"status_str\":\"�������ӹ���\"}]}"

}

(PS:本来约定的json数据中 request字段也是个对象,结果转成了字符串 T_T )

        这中间为了检查错误,折腾了好久,好在最终解决了,下面我说一下解决的过程。

        先假设我负责的模块叫模块A,用C#开发的同事负责的模块叫模块B,用c++开发的同事负责的模块叫模块C,出现这个问题的原因是,模块C的同事封了个dll库,用来处理传输数据的json封装和解析,这样模块B的同事可以直接调用这个库,所以模块B和模块C之间相互传输数据的时候,封装解析json都没有问题。但是我负责的模块A是用Java开发的,对传输的数据的封装解析都是得自己写的,无法调用模块C同事提供的dll库。

        我之所以从共用的redis中获取的数据是乱码,有两个原因。

  1. 模块C的默认字符集是GB2312,而我这边Java的字符集是UTF-8,两边的编码不一致 T_T;
  2. 模块C的同事封装的dll库,向redis的列表中push的时候,不是push的字符串,而是byte数组(这又是一个悲伤的故事T_T);

(PS:据说原因2是因为在C++中,字符串和byte数组是一回事,那边的同事在往redis中push的时候也没有处理一下,结果就存成了byte数组)

        在这里,给上两张用RedisDesktopManager的截图来区分一下往redis中存字符串和存byte数组的区别:

存字符串的如下:

 存byte数组的如下:

好了,知道了原因了,就好解决了,基本的思路是:用jedis不直接取字符串了,取byte数组;然后将取到的byte数组以 GB2312 的编码读出来,就会发现乱码问题解决了

具体测试代码如下:

@Test
public void redisT1() {
    // 1. 设置IP地址和端口
    Jedis jedis = new Jedis("127.0.0.1", 6379);
    // 2. 选择知道的redisDB
    jedis.select(0);
    // 3. 从redis 的 CLIENT_DEVICE_STATUS 列表中取byte数组
    try {
        byte[] json = jedis.rpop("CLIENT_DEVICE_STATUS".getBytes("gb2312"));// 此处可以不指定字符集
        String jsonStr = new String(json, "gb2312");
        System.out.println("jsonStr--" + jsonStr);
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
    // 4. 释放资源
    jedis.close();
}

打印出的结果如下:

{ "uuid": "fcbb1a40-3eaa-487f-84b9-6bxxxxx4a1", "request": "{\"uuid\":\"3375dbdd-dd6-49c7-b68a-305a562de1a3\",\"type\":\"STATUS_REPORT\",\"device_class\":\"CAMERA\",\"err_cod\":\"OK\",\"err_str\":\"\",\"data\":[{\"device_id\":\"topdamage-59d5-44fc-8bf3-e59c475c70ec\",\"status\":\"ERR_NETWORK\",\"status_str\":\"网络连接故障\"},{\"device_id\":\"leftdamage-039a-4e5f-8b91-44f9fa21b3e8\",\"status\":\"ERR_NETWORK\",\"status_str\":\"网络连接故障\"},{\"device_id\":\"rightdamge-e691-442d-b5dd-eae66cd855df\",\"status\":\"ERR_NETWORK\",\"status_str\":\"网络连接故障\"},{\"device_id\":\"27ff7b79-33ca-4662-a981-037b7c63ab7d\",\"status\":\"ERR_NETWORK\",\"status_str\":\"网络连接故障\"},{\"device_id\":\"a4107069-37fd-47b3-aa4b-91990a390f4a\",\"status\":\"ERR_NETWORK\",\"status_str\":\"网络连接故障\"},{\"device_id\":\"c0e28cbb-2b2e-4959-b821-fcd70395e1d7\",\"status\":\"ERR_NETWORK\",\"status_str\":\"网络连接故障\"}]}" }

然后就可以解析这个json啦 ~_~   ^_^

我的微信公众号:

基本是年更的状态,感兴趣的同学可以关注一下 ~_~

猜你喜欢

转载自blog.csdn.net/baidu_15338861/article/details/107859793