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 的一致,有什么好的方式吗?
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.