2016-08-01 23 views
1

Go上的主要主题专家之一Dave Cheney写道:“当使用复合文字初始化变量时,Go要求复合文本的每一行结束用逗号,甚至是你声明的最后一行,这是semicolon rule的结果。“使用尾随逗号分析JSON数组和地图元素时的运行时错误

但是,当我试图将这个漂亮的规则应用于JSON文本时,解析器似乎并不赞同这种理念。在下面的代码中,删除逗号的作品。是否有修复这个,所以我可以看到一行改变,当我在我的差异添加元素?

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type jsonobject struct { 
    Objects []ObjectType `json:"objects"` 
} 

type ObjectType struct { 
    Name string `json:"name"` 
} 

func main() { 
    bytes := []byte(`{ "objects": 
     [ 
      {"name": "foo"}, // REMOVE THE COMMA TO MAKE THE CODE WORK! 
     ]}`) 
    jsontype := &jsonobject{} 
    json.Unmarshal(bytes, &jsontype) 
    fmt.Printf("Results: %v\n", jsontype.Objects[0].Name) // panic: runtime error: index out of range 
} 

回答

5

没有。 JSON specification不允许尾随逗号。

这不是一个有效的JSON:

{ "objects": 
    [ 
     {"name": "foo"}, 
]} 

这是你需要使用逗号如果枚举不就行了(more on this)关闭围棋语法,如:

// Slice literal: 
s := []int { 
    1, 
    2, 
} 

// Function call: 
fmt.Println(
    "Slice:", 
    s, 
) 

即使您可以“说服”某个特定的JSON解析器以静默吞下它,其他有效的JSON解析器也会正确报告错误。不要这样做。