0

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.

5
  • 2
    Try mholt.github.io/json-to-go - which can generate a Go struct based on JSON input (provided the JSON is correctly formatted). Commented Jul 24, 2015 at 9:49
  • @elithrar , thanks for the link, it seems it's a great service. Commented Jul 24, 2015 at 10:01
  • @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. Commented Jul 24, 2015 at 10:03
  • 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. Commented Jul 24, 2015 at 10:23
  • @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? Commented Jul 24, 2015 at 10:46

2 Answers 2

1

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.

Sign up to request clarification or add additional context in comments.

Comments

0

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
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.