Java JSON 序列化如何匹配 Python json.dumps() 结果

2018-10-23 14:12:17 +08:00
 corningsun

Java 项目对接 Python 服务端接口时,需要做参数 md5 校验

Python 中处理参数是通过 json.dumps() 方式先拿到请求 json 再计算 md5 值的

但是 Python 和 Java 序列化的结果不一致,导致 md5 验证无法通过

Python 代码示例

#!/usr/bin/env python3
# coding: utf-8

from json import dumps

if __name__ == '__main__':

    demo_bean = {
        "id": 1,
        "name": "demoName",
        "values": [1, 2, 3, 4]
    }
    demo_json = dumps(demo_bean, sort_keys=True).encode('utf-8')
    print(demo_json)

// 输出结果:
// b'{"id": 1, "name": "demoName", "values": [1, 2, 3, 4]}'

Java 我用的是 FastJson

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.google.common.collect.Lists;
import lombok.Builder;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.junit.Test;

import java.util.List;

@Slf4j
public class FastJsonTest {

    @Test
    public void testClean() throws Exception {
        DemoBean demoBean = DemoBean.builder()
                .id(1)
                .name("demoName")
                .values(Lists.newArrayList(1, 2, 3, 4))
                .build();

        String demoJson = JSON.toJSONString(demoBean, SerializerFeature.SortField);

        log.debug("demoJson={}", demoJson);
    }
}

@Data
@Builder
class DemoBean {
    private Integer id;
    private String name;
    private List<Integer> values;
}

// 输出
// demoJson={"id":1,"name":"demoName","values":[1,2,3,4]}

我比较了下两种方式的输出,主要是 Python 序列化结果多了一些 “空格”。

python: {"id": 1, "name": "demoName", "values": [1, 2, 3, 4]}
java  : {"id":1,"name":"demoName","values":[1,2,3,4]}

目前 Python 服务端代码不能变更,只能使 Java 的 json 对象序列化结果和 Python 的一致,有什么好的方式吗?

5257 次点击
所在节点    Java
23 条回复
corningsun
2018-10-23 17:57:51 +08:00
@woodensail 服务端代码改不了了。
@kkkkkrua
fastjson 也有 pretty 方法,但是只是增加了 换行,没有加空格。
objectMapper 的 pretty 方法,在冒号的 两边都加了空格,只去除换行还不够。另外处理 list 数组时,也不一致。
corningsun
2018-10-23 18:39:25 +08:00
终于找到方法了,具体看附言内容,谢谢大家了。
Sum0l
233 天前
学习了,还得是该源码最可靠 哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/500208

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX