将JSON文件解析为struct golang

时间:2015-07-24 09:41:53

标签: json struct go

我有这个JSON文件:

    {
  "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"
  }
}

这只是一个测试的例子,但我的实际json文件会有更多的数据。但格式总是一样的。我将有一系列的大学'例如AHSS'和ProfServices'。在这些学院里面是学校'例如' IT'或者' Lifeling Learning'。每所学校都有自己独特的钥匙。我需要读取此JSON文件并将其转换为结构。

我试过四处寻找并使用json.Decode和json.Unmarshal,我真的不知道如何得到我需要的东西。我尝试的所有东西都打印出一个空结构。也许我的结构的布局是错误的?

这是我正在使用的结构布局(不是100%这是正确的):

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

以下是我尝试使用的两种方法来实现将json文件导入结构的目标。

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)

任何人都可以提供正确导入此json文件的方法吗?我不确定我的方法是否存在问题,或者结构布局是否存在问题。

感谢。

2 个答案:

答案 0 :(得分:0)

你有一个字符串对象的对象。这最自然地解构为

map[string]map[string]string

然后就像使用任何其他地图一样使用它。

游乐场:http://play.golang.org/p/_IX8WUDn4b

答案 1 :(得分:0)

这是我写的将JSON字符串转换为struct或struct To JSON的内容。 只需将您的结构(如JSON)传递为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
}