Laz*_*kic 2 go hyperledger-fabric hyperledger-chaincode
我正在使用 Hyperledger Fabric 2.2.0 和 Fabric-network 2.1(不是那么重要)。
我的链码是用 Go 编写的。所以我有一些带有,omitempty
JSON 标签的结构。这是我的结构:
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
。
这是故意的吗?或者我在这里遗漏了什么?
提前致谢
我在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)