发送含JSON Map的请求至外部系统后冒号被替换为=>问题咨询
问题原因
- 该现象是外部系统后端使用Ruby/Rails技术栈导致的:
=>是Ruby语言哈希(Hash)结构的默认键值分隔符,功能和JSON的:完全一致,当Ruby直接对哈希对象执行字符串序列化时,就会输出带=>的格式。 - 外部系统未做标准JSON序列化处理:你发送的标准JSON请求被外部系统解析为Ruby哈希后,没有重新序列化为标准JSON就直接存储、对外返回,甚至将整个哈希转成的字符串作为值存入
map字段,最终Postman响应中才会出现外层套转义引号、整个map是字符串类型的异常表现。
排查修复方案
- 先完成己方校验:
抓包确认己方请求头Content-Type正确设置为application/json,请求体JSON格式合法(你给出的示例中原始JSON最后一个键值对后多了冗余逗号,需排查实际请求是否存在类似格式问题),确保己方发送的是符合规范的JSON payload。 - 推动外部系统修复(根因解决方案):
要求外部系统做两处调整:一是存储、返回数据时,将解析后的Ruby哈希重新序列化为标准JSON格式,禁止直接使用哈希的默认字符串输出;二是不要把整个map结构转为字符串类型存储,保留原始对象结构,避免响应时出现转义符、结构嵌套错误的问题。 - 临时兼容方案(外部系统无法快速修复时使用):
己方拿到返回结果后,先做字符串替换把所有=>替换为:,再执行JSON解析即可,示例处理代码如下:import json # 从接口拿到的原始map字符串 raw_map_str = "{\"key-1\"=>\"value-1\", \"key-2\"=>\"value-2\"}" # 替换为标准JSON格式 standard_json_str = raw_map_str.replace("=>", ":") # 解析为字典对象 map_data = json.loads(standard_json_str)
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

