【问题标题】:Error while trying to fetch queryresult.KV object in JSON.Unmarshal尝试在 JSON.Unmarshal 中获取 queryresult.KV 对象时出错
【发布时间】:2021-10-29 10:32:16
【问题描述】:

我在这里有点困惑,虽然我对此进行了很多搜索,但我的知识显然缺少一些东西,我正在寻求您的帮助。

我创建了一个 Hyperledger Fabric 网络并在其中安装了一个链码。我想创建一个函数来检索所有关于键的世界状态输入。我已经使用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 添加到自定义结构时出现上述错误? 我需要将它添加到只有它的类型的结构中吗?

请有人能解释一下我在这里缺少什么?

【问题讨论】:

  • type *queryresult.KVpkg.go.dev/github.com/hyperledger/fabric-protos-go/ledger/… 中指示的类型结构,您不能在结构类型上执行[]byte()
  • 你打算做json.Unmarshal([]byte(queryResponse.Key), &qry_key_json) 吗?
  • 是的,我做到了,而且效果很好。但我想知道如何解组整个结构。这甚至可能吗?或者不
  • 整个结构是什么意思?您的目标结构WSKeys 仅具有用于存储Keys 的字段。如果您的 JSON 中有更多字段,我建议您定义适当的结构并将其解组
  • 好的,我会继续寻找。你提出了一些想法。感谢您的宝贵时间!

标签: go hyperledger-fabric hyperledger chaincode


【解决方案1】:

错误语句足够详细,表明您的[]byte 转换对于queryResponse 类型失败,通过一些查找似乎是struct type。在 Go 中,如果不使用 gob 或其他方式进行编码,则无法将结构实例本地转换为其组成字节。

也许您的意图是使用结构中的 Key 记录进行解组

json.Unmarshal([]byte(queryResponse.Key), &qry_key_json)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多