user3358392 user3358392 - 4 months ago 11
JSON Question

Parsing JSON GO lang

I am having trouble parsing a JSON file in go lang.

I am not getting any error but I am not getting an output.
I have tried a few different methods but I cant seem to get any to work.
Any help would be greatly appreciated. Thanks in advance.

package simplefiles

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

//PluginInfo - struct for plugins.json
var PluginInfo struct {
LatestVersion string `json:"latest_version"`
LastUpdated string `json:"last_updated"`
Popular bool `json:"popular"`
Info []string `json:"Info"`
}

//ParsePlugins - parses plugins.json
func ParsePlugins() {
pluginsFile, err := os.Open("test.json")
if err != nil {
fmt.Println("opening config file", err.Error())
}
jsonParser := json.NewDecoder(pluginsFile)
if err = jsonParser.Decode(&PluginInfo); err != nil {
fmt.Println("parsing config file", err.Error())
} else {
fmt.Printf(PluginInfo.LastUpdated)
}
return
}


JSON Sample:

{
"my-test-site":{
"latest_version":"6.4.5",
"last_updated":"2016-05-22T00:23:00.000Z",
"popular":true,
"infomation":[
{
"id":6043,
"title":"Test info 1",
"created_at":"2014-08-01T10:58:35.000Z",
"updated_at":"2015-05-15T13:47:24.000Z",
"published_date":null,
"references":{
"url":[
"http://samplesite1.com",
"http://samplesite2.com"
]
},
"site_type":"info",
"fixed_v":"1.10"
}
]
},
"another-test-site":{
"latest_version":"2.1.0",
"last_updated":"2016-06-12T08:36:00.000Z",
"popular":false,
"infomation":[
{
"id":6044,
"title":"Test site 2 info",
"created_at":"2014-08-01T10:58:35.000Z",
"updated_at":"2015-05-15T13:47:24.000Z",
"published_date":null,
"references":{
"otherinfo":[
"blah blah blah"
]
},
"site_type":"search",
"fixed_v":"1.2.0"
}
]
}
}

Answer

Your problem is that your JSON data is a map of string to the struct type you defined, not the struct type directly. If you modify your code slightly as below it works, but you need to index into the map to get each struct value:

package main

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

//PluginInfo - struct for plugins.json
var PluginInfo map[string]struct { // NOTICE map of string to struct
        LatestVersion string   `json:"latest_version"`
        LastUpdated   string   `json:"last_updated"`
        Popular       bool     `json:"popular"`
        Info          []string `json:"Info"`
}

//ParsePlugins - parses plugins.json
func ParsePlugins() {
        pluginsFile, err := os.Open("test.json")
        if err != nil {
                fmt.Println("opening config file", err.Error())
        }
        jsonParser := json.NewDecoder(pluginsFile)
        if err = jsonParser.Decode(&PluginInfo); err != nil {
                fmt.Println("parsing config file", err.Error())
        } else {
                for key, val := range PluginInfo {
                        fmt.Printf("Key %q, last updated %s\n", key, val.LastUpdated)
                }
        }
        return
}

func main() {
        ParsePlugins()
}