0
votes

I have this JSON file:

    {
  "AHSS": {
    "Lifelong Learning": "1sVhClGzmD5N_S6wGiS9_xHj2IkVgSv_un0rktvH2Goo",
    "TEST Learning": "1sdfVhClGzmD5N_S6wGiS9_xHj2ffgIkVgSv_un0rko56545o",
    "TEST Learning2": "fg1ac_PiSaWzeL3bA3tjWYs23dh61sVhClHj2IkVgSv_un0rktvH2Goo",
    "TEST Learning3": "13444sVhClGzmD5N_S6wGiS9_xHj2IkVgSv_un0rktyutvH2Goo",
    "TEST Learning4": "6657681sVhClGzmD5N_S6wGiS9_xHj2IkVgSv_un0rktvH2Goo"
  },
  "ProfServices": {
    "IT": "1fgac_PiSaWzeLxxdVuZs3bA3tjWY345d",
    "SomethingElse": "1ac_Pi3bA3tjWY4563",
    "Foo": "12ac_PiVuZs3bA3tjWYghfgj",
    "Bar": "445341ac_PiSaWzeLxA3tjWY54",
    "School1": "fg1ac_PiSaWzeL3bA3tjWYs23dh6",
    "School2": "fg341ac_PiSaWzeLZs3bA3tjWYsd4",
    "School3": "fgdf1ac_PiSaWzeLuZs3bA3tjWdgfY"    
  },
  "CollegeOfEngineering": {
    "Maths": "asdasdasdas45",
    "Physics": "pa6asa_Asddg",
    "Astrophysics": "asdfdasdasda",
    "School5": "mykeyyslaksdlkasmdlka",
    "School6": "asdasdkeykeykeykey"
  },
  "AnotherCollege": {
    "School7": "f111g1a2c_PiSaWzeL3bA3tjWYsdh6",
    "School8": "f4434234g341ac_PiSafgdfgdfgWzeLZs3bA3tjWYsd4",
    "School9": "fg23df1ac_PiSaWzeLuZs3bA3tjWdgfY"
  }
}

This is just an example to test with, but my actual json file will have a lot more data. But the format will always be the same. I will have an array of 'Colleges' such as 'AHSS' and ProfServices'. Within these Colleges are 'Schools' such as 'IT' or ' Lifeling Learning'. Each school has its own unique key. I need to read this JSON file and convert it into a struct.

I've tried looking around and using both json.Decode and json.Unmarshal and I'm really not sure how to get what I need. Everything I've tried prints out an empty struct. Maybe the layout of my struct in go is wrong?

Here is the struct layout I am using (not 100% this is correct):

    // Sheets struct will import from sheets.json
    Sheets struct {
        Colleges []struct {
            SheetKeys []string
        }
    }
)

And here are two methods I tried using to achieve my goal of importing the json file into a struct.

1)

sheetData, err := os.Open("sheets.json")
if err != nil {
    log.Fatalln(err)
}

jsonParser := json.NewDecoder(sheetData)
s := Sheets{}
jsonParser.Decode(&s)
log.Println(s)

2)

sheetData, err := ioutil.ReadFile("sheets.json")
s := Sheets{}
err = json.Unmarshal(sheetData, &s)
if err != nil {
    log.Fatalln(err)
}

log.Println(s)

Can anybody provide a method of importing this json file correctly? I'm not sure if its a problem with my method of doing it, or if its a problem with the struct layout.

Thanks.

2
Try mholt.github.io/json-to-go - which can generate a Go struct based on JSON input (provided the JSON is correctly formatted).elithrar
@elithrar , thanks for the link, it seems it's a great service.user4651282
@elithrar this gives me a struct full of every single string I use in the struct. I thought it may be possible to just collect them all in a 'Colleges' array of some sort, and then access all of them in a loop? Maybe this isn't possible and I have to make a large and very specific struct, I don't know.Conor
Without seeing the whole file (or a minimal representation) it's hard to suggest a better format. Can you link to the schema? Or update your question with a (complete) sample. My suggestion otherwise would be to make separate structs for each array and then embed them into a "top level" struct that represents the whole schema.elithrar
@elithrar I just updated the example to something a bit larger. It will be that format. There will be about 5 colleges and then within these colleges will be numerous schools (ranging from 4 - 10 in different colleges), and each school will have a unique string key associated with it. Any ideas on a struct format for this?Conor

2 Answers

1
votes

You have an object of objects of strings. This unmarshals most naturally into

map[string]map[string]string

Then just work with it as you would with any other map.

Playground: http://play.golang.org/p/_IX8WUDn4b.

0
votes

this is what i wrote to convert JSON string to struct or struct To JSON. just pass your struct ( like your JSON ) as interface{}

/*
JSONStringToStructure error
convert json string to given struct
*/
func JSONStringToStructure(jsonString string, structure interface{}) error {
    jsonBytes := []byte(jsonString)
    return json.Unmarshal(jsonBytes, structure)
}

/*
StructureToJSON (string,error)
convert struct to json string
*/
func StructureToJSON(structure interface{}) (string, error) {
    bin, err := json.Marshal(structure)
    return string(bin), err
}