尝试在 JSON.Unmarshal 中获取 queryresult.KV 对象时出错
Error while trying to fetch queryresult.KV object in JSON.Unmarshal
我在这里有点困惑,虽然我对此进行了很多搜索,但我的知识显然缺少一些东西,我正在寻求你的帮助。
我已经创建了一个 Hyperledger Fabric Network 并在其中安装了链代码。我想创建一个函数来检索有关键的所有世界状态输入。我已经用 bytes.Buffer
完成了它并且它起作用了。但是我想做的是用一个结构来做。
因此,我创建了以下只有键的结构:
type WSKeys struct {
Key string `json: "key"`
Namespace string `json: "Namespace"`
}
这是我的代码函数:
func (s *SmartContract) getAllWsDataStruct(APIstub shim.ChaincodeStubInterface , args []string) sc.Response {
var keyArrayStr []WSKeys
resultsIterator, err := APIstub.GetQueryResult("{\"selector\":{\"_id\":{\"$ne\": null }} }")
if err != nil {
return shim.Error("Error occured when trying to fetch data: "+err.Error())
}
for resultsIterator.HasNext() {
// Get the next record
queryResponse, err := resultsIterator.Next()
if err != nil {
return shim.Error(err.Error())
}
fmt.Println(queryResponse)
var qry_key_json WSKeys
json.Unmarshal([]byte(queryResponse), &qry_key_json)
keyArray = append(keyArray, qry_key_json)
}
defer resultsIterator.Close()
all_bytes, _ := json.Marshal(keyArray)
fmt.Println(keyArray)
return shim.Success(all_bytes)
}
执行上述操作时出现以下错误:
cannot convert queryResponse (type *queryresult.KV) to type []byte
我可以正确地得到结果,例如,如果我这样做:
func (s *SmartContract) getAllWsDataStruct(APIstub shim.ChaincodeStubInterface , args []string) sc.Response {
var keyArray []string
resultsIterator, err := APIstub.GetQueryResult("{\"selector\":{\"_id\":{\"$ne\": null }} }")
if err != nil {
return shim.Error("Error occured when trying to fetch data: "+err.Error())
}
for resultsIterator.HasNext() {
// Get the next record
queryResponse, err := resultsIterator.Next()
if err != nil {
return shim.Error(err.Error())
}
fmt.Println(queryResponse)
keyArray = append(keyArray, queryResponse.Key)
}
defer resultsIterator.Close()
all_bytes, _ := json.Marshal(keyArray)
fmt.Println(keyArray)
return shim.Success(all_bytes)
}
但是,为什么在尝试将 queryResponse 添加到自定义结构时出现上述错误?
我是否需要将它添加到只有它的类型的结构中?
有人能解释一下我在这里遗漏了什么吗?
错误语句非常详细,表明您的 []byte
类型 queryResponse
转换失败,稍微查找一下似乎是 struct type。在 Go 中,如果不使用 gob 或其他方式进行编码,则无法将结构实例本身转换为其组成字节。
也许您的意图是使用结构中的 Key
记录进行解编组
json.Unmarshal([]byte(queryResponse.Key), &qry_key_json)
我在这里有点困惑,虽然我对此进行了很多搜索,但我的知识显然缺少一些东西,我正在寻求你的帮助。
我已经创建了一个 Hyperledger Fabric Network 并在其中安装了链代码。我想创建一个函数来检索有关键的所有世界状态输入。我已经用 bytes.Buffer
完成了它并且它起作用了。但是我想做的是用一个结构来做。
因此,我创建了以下只有键的结构:
type WSKeys struct {
Key string `json: "key"`
Namespace string `json: "Namespace"`
}
这是我的代码函数:
func (s *SmartContract) getAllWsDataStruct(APIstub shim.ChaincodeStubInterface , args []string) sc.Response {
var keyArrayStr []WSKeys
resultsIterator, err := APIstub.GetQueryResult("{\"selector\":{\"_id\":{\"$ne\": null }} }")
if err != nil {
return shim.Error("Error occured when trying to fetch data: "+err.Error())
}
for resultsIterator.HasNext() {
// Get the next record
queryResponse, err := resultsIterator.Next()
if err != nil {
return shim.Error(err.Error())
}
fmt.Println(queryResponse)
var qry_key_json WSKeys
json.Unmarshal([]byte(queryResponse), &qry_key_json)
keyArray = append(keyArray, qry_key_json)
}
defer resultsIterator.Close()
all_bytes, _ := json.Marshal(keyArray)
fmt.Println(keyArray)
return shim.Success(all_bytes)
}
执行上述操作时出现以下错误:
cannot convert queryResponse (type *queryresult.KV) to type []byte
我可以正确地得到结果,例如,如果我这样做:
func (s *SmartContract) getAllWsDataStruct(APIstub shim.ChaincodeStubInterface , args []string) sc.Response {
var keyArray []string
resultsIterator, err := APIstub.GetQueryResult("{\"selector\":{\"_id\":{\"$ne\": null }} }")
if err != nil {
return shim.Error("Error occured when trying to fetch data: "+err.Error())
}
for resultsIterator.HasNext() {
// Get the next record
queryResponse, err := resultsIterator.Next()
if err != nil {
return shim.Error(err.Error())
}
fmt.Println(queryResponse)
keyArray = append(keyArray, queryResponse.Key)
}
defer resultsIterator.Close()
all_bytes, _ := json.Marshal(keyArray)
fmt.Println(keyArray)
return shim.Success(all_bytes)
}
但是,为什么在尝试将 queryResponse 添加到自定义结构时出现上述错误? 我是否需要将它添加到只有它的类型的结构中?
有人能解释一下我在这里遗漏了什么吗?
错误语句非常详细,表明您的 []byte
类型 queryResponse
转换失败,稍微查找一下似乎是 struct type。在 Go 中,如果不使用 gob 或其他方式进行编码,则无法将结构实例本身转换为其组成字节。
也许您的意图是使用结构中的 Key
记录进行解编组
json.Unmarshal([]byte(queryResponse.Key), &qry_key_json)