Hyperledger Fabric链码查询时queryresult.KV转[]byte报错如何解决?
报错原因
你收到的类型转换错误本质是json.Unmarshal函数的入参类型不匹配导致的:json.Unmarshal的第一个参数要求传入JSON格式的字节数组([]byte类型),但你传入的是Fabric SDK预定义的*queryresult.KV结构体指针,两种类型完全不兼容,因此编译器直接抛出类型转换失败的错误。*queryresult.KV本身是已经实例化完成的结构体对象,其Key、Namespace、Value都是公开可直接读取的字段,不需要经过JSON反序列化环节就能直接取值,这也是你直接读queryResponse.Key能正常拿到结果的原因。
// 错误示例 var wsKey WSKeys // 入参类型错误:queryResponse为*queryresult.KV类型,不是[]byte类型 err := json.Unmarshal(queryResponse, &wsKey)
是否必须使用对应类型的结构体接收数据
不需要强制使用*queryresult.KV接收,你自定义的WSKeys结构体完全可用,但不需要通过JSON反序列化实现转换,直接手动赋值即可:
// 正确示例 var wsKeys []WSKeys for iter.HasNext() { kv, err := iter.Next() if err != nil { // 处理错误逻辑 } // 直接读取公开字段赋值到自定义结构体 wsKeys = append(wsKeys, WSKeys{ Key: kv.Key, Namespace: kv.Namespace, }) }
只有当你需要解析*queryresult.KV中存储的业务Value时,才需要对kv.Value(该字段本身就是[]byte类型,一般是你之前写入世界状态时序列化的JSON数据)做Unmarshal操作,此时要求接收的业务结构体字段和JSON键对应,且字段首字母大写对外公开。
遗漏的相关知识点
json.Unmarshal的使用规则:第一个入参必须是合法的JSON字节数组,第二个入参必须是接收结果的指针类型变量,否则会抛出类型错误或者序列化无结果。- Fabric链码查询结果的类型定义:
GetQueryResult返回的迭代器产出的每一项都是已经解析完成的*queryresult.KV结构体,不需要额外做反序列化处理,直接读取字段即可。 - 不必要的序列化开销:如果仅需要
Key和Namespace两个字段,直接赋值的性能远高于先把KV序列化成JSON再反序列化到自定义结构体的操作。
内容的提问来源于stack exchange,提问作者Rafail K.
相关产品推荐
相关产品推荐

