Hyperledger Fabic 2.2.0 错误处理成功响应。值与架构不匹配

Laz*_*kic 2 go hyperledger-fabric hyperledger-chaincode

我正在使用 Hyperledger Fabric 2.2.0 和 Fabric-network 2.1(不是那么重要)。

我的链码是用 Go 编写的。所以我有一些带有,omitemptyJSON 标签的结构。这是我的结构:

type LeaseDetails struct {
    EndOfTerm string `json:"endOfTerm"`
    Info      string `json:"info,omitempty"`
    Option    string `json:"option,omitempty"`
}
Run Code Online (Sandbox Code Playgroud)

但我从链代码中收到以下错误作为返回值:

peer=peer0.org1.example.com:7051, status=500, message=Error handling success response. Value did not match schema:
1. return.0.leaseDetails: info,omitempty is required
2. return.0.leaseDetails: option,omitempty is required
Run Code Online (Sandbox Code Playgroud)

如果我,omitempty从结构中删除并提供默认值,一切都会正常工作。在文档中fabric-contract-api-go提到有某种基于 json marshal/unmarshal 构建的序列化器,但对我来说,它似乎没有检测到关键字,omitempty

这是故意的吗?或者我在这里遗漏了什么?

提前致谢

Laz*_*kic 5

我在Hyperledger Chat上从用户 @awjh 那里得到了答案。

这正如预期的那样,将 json 与元数据模式进行比较。默认情况下,所有字段都是必需的,使用 omitempty 意味着 JSON 过程将在该字段没有值时删除该字段。这意味着必填字段将丢失。要解决此问题,请添加元数据标记以将该字段标记为可选metadata:",optional"

所以就我而言,解决方案是:

type LeaseDetails struct {
    EndOfTerm string `json:"endOfTerm"`
    Info      string `json:"info,omitempty" metadata:",optional"`
    Option    string `json:"option,omitempty" metadata:",optional"`
}
Run Code Online (Sandbox Code Playgroud)