Golang: json.Unmarshal does not return data correctly

I have a json file (themes / snow / theme.json)

{ Name:'snow', Bgimage:'background.jpg', Width:600, Height:400, Itemrotation:'20,40', Text:{ Fontsize:12, Color:'#ff00ff', Fontfamily:'verdana', Bottommargin:20 }, Decoration:[ { Path:'abc.jpg', X:2, Y:4, Rotation:0 }, { Path:'def.png', X:4, Y:22, Rotation:10 } ] } 

And I have a file that parses json data

 package main import ( "fmt" "os" "encoding/json" "io/ioutil" "log" ) const themeDirectory = "themes" const themeJsonFile = "theme.json" type TextInfo struct { Fontsize int Color string Fontfamily string Bottommargin int } type DecoInfo struct { Path string X int Y int Rotation int } type ThemeInfo struct { Name string Bgimage string Width int Height int Itemrotation string Text textInfo Decoration []decoInfo } func main() { var tinfo = parseTheme("snow") //use tinfo to build graphics } func parseTheme(themename string) themeInfo { abspath, _ := os.Getwd() filename := abspath + "/" + themeDirectory + "/" + themename + "/" + themeJsonFile //Check this file exists if _, error := os.Stat(filename); error != nil { if os.IsNotExist(error) { log.Fatal(filename + " does not exist") os.Exit(1) } } filebyte, error := ioutil.ReadFile(filename) if error != nil { log.Fatal("Could not read file " + filename + " to parse") os.Exit(1) } var t themeInfo json.Unmarshal(filebyte, &t) fmt.Println(t) return t } 

You can see that I have 2 lines to the end

  fmt.Println(t) 

I'm not sure why it prints

 { 0 0 {0 0} []} 

I expect it to return the themeInfo to me in a useful way so that I can use it for further processing. What am I doing wrong here?

+4
source share
2 answers

Your JSON is invalid. JavaScript allows single quotes; JSON is not . In addition, the keys of the object must be double:

 Valid: { "name": "Simon" } Invalid: { name: "Simon" } { 'name': "Simon" } { "name": 'Simon' } 

If you close the keys and JSON values ​​with double quotes, you will see the expected result:

 {snow background.jpg 600 400 20,40 {12 #ff00ff verdana 20} [{abc.jpg 2 4 0} {def.png 4 22 10}]} 

For exmaple

 const sampleTheme = `{ "Name":"snow", "Bgimage":"background.jpg", "Width":600, "Height":400, "Itemrotation":"20,40", "Text":{ "Fontsize":12, "Color":"#ff00ff", "Fontfamily":"verdana", "Bottommargin":20 }, "Decoration":[ { "Path":"abc.jpg", "X":2, "Y":4, "Rotation":0 }, { "Path":"def.png", "X":4, "Y":22, "Rotation":10 } ] }` 

For the full program, see: http://play.golang.org/p/SLhaLbJcla

+8
source

Since the json package uses reflection to parse your structures, it can only see exported fields. All field names begin with lowercase letters, so they are not exported. Change the names to start with uppercase letters, and I suspect that it will start working for you.

+16
source

Source: https://habr.com/ru/post/1434975/


All Articles