我對 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>0x000000000000000000000000000000000>balance>*>之類的值,這 只是我嘗試過的眾多結構之一。我在條目 0x0000000000000000000000000000000000000000 下找不到任何東西
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"`
}
EDIT: Code for umarshal
retObj := rpcCall(jstring)
var callResponse res_trace_replayTransaction
err := json.Unmarshal(retObj, &callResponse)
uj5u.com熱心網友回復:
請注意,默認情況下,該encoding/json包可以將 JSON 字串解組為 Go string,并且可以將 JSON 物件解組為 Gomap或 Go struct。此外,它可以將任何 JSON 值解組為空的interface{}.
另請注意,Go 是一種靜態型別語言,如果您指定一個型別的值,T1那么在運行時,您不能將其型別更改為T2. 沒有辦法做到這一點,也沒有辦法改變一個值的型別。
因此,如果您將某個欄位定義為某種struct型別,則默認情況下您無法將 JSON 字串解組到其中。同樣,如果您將欄位定義為 type string,則默認情況下您無法將 JSON 物件解組到其中。
但由于JSON本身允許動態結構的encoding/json包提供了兩個介面,讓您自定義JSON是怎樣的能力編組和取消封送。
因此,如果您有一個可以是(字串)或(物件)的 JSON 屬性(例如"balance"或"nonce"),您將需要宣告一個自定義型別來實作和介面,這些介面知道如何正確編組和解組 JSON 值."="{ ... }json.Marshalerjson.Unmarshaler
例如:
type structChange struct {
Changes map[string]string `json:"*"`
}
func (s structChange) MarshalJSON() ([]byte, error) {
// if empty retrun `"="`
if len(s.Changes) == 0 {
return []byte(`"="`), nil
}
// otherwise marshal as is
type T structChange
return json.Marshal(T(s))
}
func (s *structChange) UnmarshalJSON(data []byte) error {
// if `"="`, ignore
if string(data) == `"="` {
return nil
}
// otherwise assume it's a valid object
type T structChange
return json.Unmarshal(data, (*T)(s))
}
注意:T上面的臨時型別用于避免無限遞回呼叫MarshalJSON和UnmarshalJSON方法導致的堆疊溢位。
https://go.dev/play/p/yfsTrMozZ2Z
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/387460.html
