Go:使用结构字段(而不是json键)将结构写入Json文件

时间:2014-07-16 00:39:19

标签: json go

如何将json文件读入结构体中,然后使用Struct字段作为键(而不是原始的json键)将其备份为json字符串?

(见下面Desired Output to Json File ...)

代码:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

type Rankings struct {
    Keyword  string `json:"keyword"`
    GetCount uint32 `json:"get_count"`
    Engine   string `json:"engine"`
    Locale   string `json:"locale"`
    Mobile   bool   `json:"mobile"`
}

func main() {
    var jsonBlob = []byte(`
        {"keyword":"hipaa compliance form", "get_count":157, "engine":"google", "locale":"en-us", "mobile":false}
    `)
    rankings := Rankings{}
    err := json.Unmarshal(jsonBlob, &rankings)
    if err != nil {
        // nozzle.printError("opening config file", err.Error())
    }

    rankingsJson, _ := json.Marshal(rankings)
    err = ioutil.WriteFile("output.json", rankingsJson, 0644)
    fmt.Printf("%+v", rankings)
}

屏幕输出:

{Keyword:hipaa compliance form GetCount:157 Engine:google Locale:en-us Mobile:false}

输出到Json文件:

{"keyword":"hipaa compliance form","get_count":157,"engine":"google","locale":"en-us","mobile":false}

对Json文件的所需输出:

{"Keyword":"hipaa compliance form","GetCount":157,"Engine":"google","Locale":"en-us","Mobile":false}

3 个答案:

答案 0 :(得分:21)

如果我理解你的问题,你要做的就是从结构定义中删除json标签。

所以:

package main

import (
    "encoding/json"
    "fmt"
    "io/ioutil"
)

type Rankings struct {
    Keyword  string 
    GetCount uint32 
    Engine   string 
    Locale   string 
    Mobile   bool   
}

func main() {
    var jsonBlob = []byte(`
        {"keyword":"hipaa compliance form", "get_count":157, "engine":"google", "locale":"en-us", "mobile":false}
    `)
    rankings := Rankings{}
    err := json.Unmarshal(jsonBlob, &rankings)
    if err != nil {
        // nozzle.printError("opening config file", err.Error())
    }

    rankingsJson, _ := json.Marshal(rankings)
    err = ioutil.WriteFile("output.json", rankingsJson, 0644)
    fmt.Printf("%+v", rankings)
}

结果:

{Keyword:hipaa compliance form GetCount:0 Engine:google Locale:en-us Mobile:false}

文件输出为:

{"Keyword":"hipaa compliance form","GetCount":0,"Engine":"google","Locale":"    en-us","Mobile":false}

http://play.golang.org/p/dC3s37HxvZ

运行示例

注意:GetCount显示0,因为它被读入"get_count"。如果您想要读取具有"get_count""GetCount"的JSON,但输出"GetCount",那么您将需要进行一些额外的解析。

有关此特定情况的其他信息,请参阅Go- Copy all common fields between structs

答案 1 :(得分:0)

尝试更改struct

中的json格式
type Rankings struct {
    Keyword  string `json:"Keyword"`
    GetCount uint32 `json:"Get_count"`
    Engine   string `json:"Engine"`
    Locale   string `json:"Locale"`
    Mobile   bool   `json:"Mobile"`
}

答案 2 :(得分:0)

仅通过使用json.Marshal()/ json.MarshalIndent()就发生了趣味。 它会覆盖现有文件,在我的情况下,它是次优的。我只是想将内容添加到当前文件,并保留旧内容。

这将通过字节类型为缓冲区的缓冲区写入数据。

这是我到目前为止收集的:

s3

这是函数的执行,以及覆盖文件的标准json.Marshal()或json.MarshalIndent()

package srf

import (
    "bytes"
    "encoding/json"
    "os"
)

func WriteDataToFileAsJSON(data interface{}, filedir string) (int, error) {
    //write data as buffer to json encoder
    buffer := new(bytes.Buffer)
    encoder := json.NewEncoder(buffer)
    encoder.SetIndent("", "\t")

    err := encoder.Encode(data)
    if err != nil {
        return 0, err
    }
    file, err := os.OpenFile(filedir, os.O_RDWR|os.O_CREATE, 0755)
    if err != nil {
        return 0, err
    }
    n, err := file.Write(buffer.Bytes())
    if err != nil {
        return 0, err
    }
    return n, nil
}

这为什么有用? package main import ( "encoding/json" "fmt" "io/ioutil" "log" minerals "./minerals" srf "./srf" ) func main() { //array of Test struct var SomeType [10]minerals.Test //Create 10 units of some random data to write for a := 0; a < 10; a++ { SomeType[a] = minerals.Test{ Name: "Rand", Id: 123, A: "desc", Num: 999, Link: "somelink", People: []string{"John Doe", "Aby Daby"}, } } //writes aditional data to existing file, or creates a new file n, err := srf.WriteDataToFileAsJSON(SomeType, "test2.json") if err != nil { log.Fatal(err) } fmt.Println("srf printed ", n, " bytes to ", "test2.json") //overrides previous file b, _ := json.MarshalIndent(SomeType, "", "\t") ioutil.WriteFile("test.json", b, 0644) } 返回写入文件的字节!因此,如果要管理内存或存储,这是完美的选择。

File.Write()