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

Joe*_*vin 12 json go

如何将json文件读入结构体,然后将其作为键(而不是原始的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)
}
Run Code Online (Sandbox Code Playgroud)

屏幕输出:

{Keyword:hipaa compliance form GetCount:157 Engine:google Locale:en-us Mobile:false}
Run Code Online (Sandbox Code Playgroud)

输出到Json文件:

{"keyword":"hipaa compliance form","get_count":157,"engine":"google","locale":"en-us","mobile":false}
Run Code Online (Sandbox Code Playgroud)

期望输出到Json文件:

{"Keyword":"hipaa compliance form","GetCount":157,"Engine":"google","Locale":"en-us","Mobile":false}
Run Code Online (Sandbox Code Playgroud)

Mom*_*mer 24

如果我正确理解你的问题,你要做的就是从结构定义中删除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)
}
Run Code Online (Sandbox Code Playgroud)

结果是:

{Keyword:hipaa compliance form GetCount:0 Engine:google Locale:en-us Mobile:false}
Run Code Online (Sandbox Code Playgroud)

文件输出是:

{"Keyword":"hipaa compliance form","GetCount":0,"Engine":"google","Locale":"    en-us","Mobile":false}
Run Code Online (Sandbox Code Playgroud)

http://play.golang.org/p/dC3s37HxvZ上运行示例

注意:GetCount显示0,因为它被读入"get_count".如果你想读入具有"get_count"vs.的JSON "GetCount",但输出"GetCount"那么你将不得不做一些额外的解析.

有关此特定情况的其他信息,请参阅Go-复制结构之间的所有常用字段.

  • Go 1.8现在允许您直接复制到具有相同字段名称但不同标签defs的结构:"当将值从一种结构类型显式转换为另一种结构类型时,从Go 1.8开始,标记将被忽略.因此,两个结构只有不同在他们的标签中可以从一个转换为另一个"(参见https://golang.org/doc/go1.8).所以我只有2个结构:一个用于解组API响应,另一个用于编组它我想要它.看调整后的游乐场:https://play.golang.org/p/lEdh1Fammj (3认同)