来自结构指针的字符串

时间:2019-04-06 19:54:34

标签: json go

作为围棋的学生,我遇到了这个问题。

我这样做的最终目的是将*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}

1 个答案:

答案 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}