Hyperledger Fabric应用JSON响应含多余反斜杠问题求助
你碰到的这个问题其实是JSON重复序列化导致的,咱们来一步步理清原因和解决办法:
问题根源
从你的Docker日志能看到,logger.Debug(string(result))输出的JSON是完全正常的,没有多余的反斜杠;但CLI返回的payload里却出现了\"。这说明:
你的代码里对history做了一次json.Marshal序列化,而后续Fabric的响应处理又把这个已经序列化好的JSON字符串当成普通字符串再次做了转义处理。
仔细看你的代码:
result, err := json.Marshal(history) // ... return shim.Success(result)
如果history本身已经是一个JSON格式的字符串(比如你从账本中读取的就是已经序列化好的JSON数据),那么json.Marshal(history)会把这个字符串当作普通Go字符串来处理——给它加上外层双引号,同时把内部的双引号转义成\",最终得到的result就是带反斜杠的字节数组,返回给CLI后就会显示出你看到的结果。
解决方案
根据history的类型不同,有两种处理方式:
1. 如果history是Go结构体/切片(推荐方式)
如果history是你定义的Go结构体或者切片类型(比如type History struct { ... }或者[]History),那你的序列化逻辑是对的,但CLI显示的转义是因为Fabric CLI把payload当成字符串输出了。你可以用jq工具来解析并格式化payload:
# 调用链码后用jq处理输出 peer chaincode invoke -n your_cc -c '{"Args":["getHistory","key"]}' -C your_channel | jq '.payload' | xargs echo -e | jq
这样就能得到你预期的格式化JSON结果。
2. 如果history已经是JSON字符串
如果history本身就是一个已经序列化完成的JSON字符串(比如从账本中直接读取的就是JSON格式的字符串数据),那你不需要再调用json.Marshal,直接把字符串转成[]byte返回即可:
// 去掉多余的json.Marshal,直接转换为字节数组 result := []byte(history) logger.Debug(string(result)) logger.Info("SimpleChaincode.getHistory exited successfully") return shim.Success(result)
这样返回的payload就是原始的JSON字节数组,CLI显示时就不会有多余的反斜杠了。
验证小技巧
你可以在代码里先打印history的类型和内容,确认它到底是Go结构体还是JSON字符串:
logger.Debug("history type: %T, content: %v", history, history)
根据打印结果选择对应的解决方案即可。
内容的提问来源于stack exchange,提问作者Kevin Wiranata

