web-dev-qa-db-fra.com

Allez: écrivez Struct dans un fichier Json en utilisant des champs de structure (pas de clés json)

Comment puis-je lire un fichier JSON dans une structure, puis le rediriger vers une chaîne JSON avec les champs Struct comme clés (plutôt que les clés json d'origine)?

(voir Desired Output to Json File ci-dessous ...)

Code:

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)
}

Sortie à l'écran:

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

Sortie dans un fichier Json: 

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

Sortie souhaitée dans le fichier Json:

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

Si je comprends bien votre question, tout ce que vous voulez faire est de supprimer les balises Json de votre définition de struct.

Alors:

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)
}

Résulte en:

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

Et le fichier en sortie est:

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

Exemple en cours d'exécution à http://play.golang.org/p/dC3s37HxvZ

Remarque: GetCount affiche 0, puisqu'il a été lu en tant que "get_count". Si vous souhaitez lire un code JSON avec "get_count" vs "GetCount", mais que vous produisez "GetCount", vous devrez effectuer une analyse complémentaire.

Voir Go - Copiez tous les champs communs entre structs pour plus d’informations sur cette situation particulière.

17
Momer

Essayez de changer le format JSON dans la structure

type Rankings struct {
    Keyword  string `json:"Keyword"`
    GetCount uint32 `json:"Get_count"`
    Engine   string `json:"Engine"`
    Locale   string `json:"Locale"`
    Mobile   bool   `json:"Mobile"`
}
0
boulavard