2015-08-08 75 views
-1

我试图从一个文件读取并将其加载到一个结构片。我读入的行加载正确,如块注释中所示。Unmarshal()返回空结构

我遇到的问题是class变量不断返回空值。我究竟做错了什么?

func loadClasses(path string) []Class { 
    var a []Class 

    inFile, _ := os.Open(path) 
    defer inFile.Close() 
    scanner := bufio.NewScanner(inFile) 
    scanner.Split(bufio.ScanLines) 
    var class Class 
    for scanner.Scan() { 
     var err = json.Unmarshal(scanner.Bytes(), &class) 

     if err != nil { 
      fmt.Print("Error:", err) 
     } else { 
      a = append(a, class) 
     } 
    } 
    return a 
} 

type Class struct { 
    id string 
    name string 
} 

/* 
Sample contents 
"{"id":124997,"name":"Environmental Sciences"} 
{"id":123905,"name":"Physical Education"} 
{"id":127834,"name":"Mandarin"} 
{"id":123507,"name":"Biology"} 
{"id":123883,"name":"German"} 
{"id":129148,"name":"German"} 
{"id":123545,"name":"Spanish"}" 

*/ 

谢谢isim的帮助。我的问题是两个部分,该结构成员必须予以资本化,我错过了json: "id"json: "name"

+1

尝试通过将'id'和'name'的第一个字母大写,在'Class'中输出字段。 –

+0

如果解决了您的问题,请考虑将答案标记为已接受。谢谢。 –

+0

重复的http://stackoverflow.com/questions/26327391/golang-json-marshalstruct-returns –

回答

4

您可以通过更改字段的第一个字母大写这样导出您Class结构中的字段:

type Class struct{ 
    Id string 
    Name string 
} 

或者,您也可以添加标签领域是这样的:

type Class struct{ 
    Id string `json: "id"` 
    Name string `json: "name"` 
} 
json包如何处理编码和解码

的更多信息,可以发现分别在json.Marshaljson.Unmarshal文档中。

+0

关闭:第二个将无法正常工作,因为'反映',因此'encoding/json'根本无法看到字段小写名称。您希望使用第一个代码片段中的字段名称,但使用结构标签表示它们应该使用输入中的小写键名填充。 – twotwotwo

+0

@twotwotwo固定。谢谢! –