【发布时间】:2022-01-21 01:55:22
【问题描述】:
我是 GOLANG 的新手。
我已经尝试了很长一段时间来解组具有动态结构的以太坊 RPC JSON。我没有工作过 GOLANG 结构和映射设置,我能够获得 stateDiff 条目(3),但所有较低的结构似乎都没有填充任何数据。所以我能够遍历所有 3 个条目,但不知道如何访问下面的值,并且在转储解组结果时,我看到 GOLANG 并没有将数据传递到 StateDiff
JSON 文件:
{
"jsonrpc":"2.0",
"id":1,
"result":{
"output":"0x0000000000000000000000000000000000000000000000000000000000000001",
"stateDiff":{
"0x0000000000000000000000000000000000000000":{
"balance":{
"*":{
"from":"0x45acecdfadb71366cf",
"to":"0x45aced3909536ccacf"
}
},
"code":"=",
"nonce":"=",
"storage":{
}
},
"0x07865c6e87b9f70255377e024ace6630c1eaa37f":{
"balance":"=",
"code":"=",
"nonce":"=",
"storage":{
"0x86a60af761556602732bbdeaef13ba6e2481f83362d3489389f51353d86a6ac3":{
"*":{
"from":"0x0000000000000000000000000000000000000000000000000000000000000000",
"to":"0x0000000000000000000000000000000000000000000000000000000000002710"
}
},
"0xb0cf6f3c0836765b9dee3d1537458f10fe99447508adc172c1f633ac7352aaa8":{
"*":{
"from":"0x00000000000000000000000000000000000000000000000000092f379a04d2b0",
"to":"0x00000000000000000000000000000000000000000000000000092f379a04aba0"
}
}
}
},
"0x6dbe810e3314546009bd6e1b29f9031211cda5d2":{
"balance":{
"*":{
"from":"0x41c41fc2c0247860",
"to":"0x41c3c66723c4155c"
}
},
"code":"=",
"nonce":{
"*":{
"from":"0x741",
"to":"0x742"
}
},
"storage":{
}
}
},
"trace":[
],
"vmTrace":null
}
}
我试图将 JSON 解组为以下结构(在许多结构中),但我无法从 result>stateDiff>0x00000000000000000000000000000000000000000>balance>*>from 获取值 下面的结构只是我尝试过的众多之一。我在 0x000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 任何任何东西下面的任何东西
type structChange struct {
Changes map[string]string `json:"*"`
}
type structStateDiff struct {
Balance *structChange `json:"balance"`
Code string `json:"code"`
Nonce string `json:"nonce"`
Storage map[string]*structChange `json:"storage"`
}
type res_trace_replayTransaction struct {
Jsonrpc string `json:"jsonrpc"`
ID int `json:"id"`
Result struct {
Output string `json:"output"`
StateDiff map[string]*structStateDiff `json:"stateDiff"`
Trace []interface{} `json:"trace"`
VMTrace interface{} `json:"vmTrace"`
} `json:"result"`
}
编辑: 元帅代码
retObj := rpcCall(jstring)
var callResponse res_trace_replayTransaction
err := json.Unmarshal(retObj, &callResponse)
【问题讨论】:
-
请阅读 Go 教程:go.dev/doc/tutorial/getting-started,然后阅读 Go Json 教程,例如 gobyexample.com/json,我强烈建议不要匿名。而是为每个结构定义顶级
types,然后在包含它的结构中使用类型名称。 -
已阅读,但我无法解决此问题。
-
然后再仔细阅读一下 json 示例。前 3 段中的一段告诉您您做错了什么:“只有导出的字段才会在 JSON 中编码/解码。字段必须以大写字母开头才能导出。”
-
"我没有工作过的 GOLANG 结构和地图设置" 我会为此使用
structs - 不是匿名的,而是命名的结构类型 - 但你不需要需要使用structs。您也可以执行go.dev/play/p/P4ryK-9wuVl 之类的操作 - 缺点是您必须自己进行所有类型检查,这就是structs 更好的原因 -
另外你没有包含你的解组代码