作为围棋的学生,我遇到了这个问题。
我这样做的最终目的是将*blockchain
转换为有效的JSON字符串。
我的结构是:
type Blockchain struct{
blocks []Block `json:"blocks"`
difficulty int `json:"difficulty"`
}
type Block struct{
index int `json:"index"`
timestamp string `json:"timestamp"`
data string `json:"data"`
previousHash string `json:"previousHash"`
hash string `json:"hash"`
nonce int `json:"nonce"`
}
我有以下代码:
var s = fmt.Sprintf("%#v", *blockchain)
print(s)
哪些给了我以下内容:
main.Blockchain {blocks:[] main.Block {main.Block {index:1,timestamp:“ 2019-04-06 12:50:54”,数据:“ Genesis block”,previousHash:“”,哈希:“ eca16d7bdd20a91f471fc3231fa5de7d892fb540789673d64f29a7b93719b74b”,随机数:0},main.Block {index:2,时间戳记:“ 2019-04-06 12:50:54”,数据:“ d.duck”,previousHash:“ eca16d7bbdf23d79f79f17df7fdfdfdfdfdfffffffffffffffffffffffffffffffffffffffffffffffffffffffb “2096ccfa6fdd8305f0e31c2e6858173a21764be4c8e1d3d50c9c31193bf06a2a”,随机数:0},{main.Block指数:3,时间戳: “2019年4月6日12时五十〇分54秒”,数据 “飞象”,previousHash: “2096ccfa6fdd8305f0e31c2e6858173a21764be4c8e1d3d50c9c31193bf06a2a”,散列: “d76d4a002c6dde01009e3122aa1ccfb455e1d453ac83e2a0eb123c6080943cdb”, nonce:0}},难度:4}
显然无效的JSON。
有什么建议吗?
我还尝试了以下方法:
var json, err = json.Marshal(*blockchain)
if err != nil{
panic(err.Error())
}
var s = fmt.Sprintf("%#v", json)
print(s)
它给了我以下内容:
[]byte{0x7b, 0x7d}
答案 0 :(得分:1)
结构上的字段需要导出(以大写字母开头)。这是必需的,因为JSON编组使用反射,并且这要求将字段导出(可见)。
另外json.Marshal
的第一个返回值是JSON。
package main
import (
"encoding/json"
"fmt"
"log"
)
type Blockchain struct {
Blocks []Block `json:"blocks"`
Difficulty int `json:"difficulty"`
}
type Block struct {
Index int `json:"index"`
Timestamp string `json:"timestamp"`
Data string `json:"data"`
PreviousHash string `json:"previousHash"`
Hash string `json:"hash"`
Nonce int `json:"nonce"`
}
func main() {
bc := &Blockchain{
Blocks: []Block{
Block{},
},
Difficulty: 1,
}
v, err := json.Marshal(bc)
if err != nil {
log.Fatal(err)
}
fmt.Println(string(v))
}
此打印:
{"blocks":[{"index":0,"timestamp":"","data":"","previousHash":"","hash":"","nonce":0}],"difficulty":1}