英文:
panic with JSON in go
问题
我尝试运行以下代码
package main
import (
"encoding/json"
"fmt"
/*"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"*/
)
func insertEntry(j *map[string]interface{}, entry string) {
err := json.Unmarshal([]byte(entry), j)
if err != nil {
panic(err)
}
}
func main() {
c1 := "{" +
`"mw" : 42.0922,` +
`"ΔfH°gas" : {` +
` "value" : 372.38,` +
` "units" : "kJ/mol"` +
`},` +
`"S°gas" : {` +
` "value" : 216.81,` +
` "units" : "J/mol×K"` +
`},` +
`"index" : [` +
` {"name" : "mw", "value" : 42.0922},` +
` {"name" : "ΔfH°gas", "value" : 372.38},` +
` {"name" : "S°gas", "value" : 216.81}` +
`]` +
`}`
c2 := "{" +
`"name" : "silicon",` +
`"mw" : 32.1173,` +
`}` +
`"index" : [` +
` {"name" : "mw", "value" : 32.1173}` +
`]` +
`}`
var m map[string]interface{}
insertEntry(&m, c1)
insertEntry(&m, c2)
chemical := m["ΔfH°gas"].(map[string]interface{})
fmt.Println("value: %s\n", chemical["value"].(string))
fmt.Println("units: %s\n", chemical["units"].(string))
But I got the following error message:
$ go run chemeo.go
panic: invalid character '}' looking for beginning of object key string
goroutine 1 [running]:
main.insertEntry(0xf840045100, 0x4badc4, 0x7f5e00000056, 0x20043115c)
/media/mictadlo/projects/mgo/chemeo/chemeo.go:19 +0xd8
main.main()
/media/mictadlo/projects/mgo/chemeo/chemeo.go:54 +0xa3
goroutine 2 [syscall]:
created by runtime.main
/usr/local/go/src/pkg/runtime/proc.c:221
exit status 2
What did I do wrong?
英文:
I tried to run the following code
package main
import (
"encoding/json"
"fmt"
/*"labix.org/v2/mgo"
"labix.org/v2/mgo/bson"*/
)
func insertEntry(j *map[string]interface{}, entry string) {
err := json.Unmarshal([]byte(entry), j)
if err != nil {
panic(err)
}
}
func main() {
c1 := "{" +
`"mw" : 42.0922,` +
`"ΔfH°gas" : {` +
` "value" : 372.38,` +
` "units" : "kJ/mol"` +
`},` +
`"S°gas" : {` +
` "value" : 216.81,` +
` "units" : "J/mol×K"` +
`},` +
`"index" : [` +
` {"name" : "mw", "value" : 42.0922},` +
` {"name" : "ΔfH°gas", "value" : 372.38},` +
` {"name" : "S°gas", "value" : 216.81}` +
`]` +
`}`
c2 := "{" +
`"name" : "silicon",` +
`"mw" : 32.1173,` +
`}` +
`"index" : [` +
` {"name" : "mw", "value" : 32.1173}` +
`]` +
`}`
var m map[string]interface{}
insertEntry(&m, c1)
insertEntry(&m, c2)
chemical := m["ΔfH°gas"].(map[string]interface{})
fmt.Println("value: %s\n", chemical["value"].(string))
fmt.Println("units: %s\n", chemical["units"].(string))
But I got the following error message:
$ go run chemeo.go
panic: invalid character '}' looking for beginning of object key string
goroutine 1 [running]:
main.insertEntry(0xf840045100, 0x4badc4, 0x7f5e00000056, 0x20043115c)
/media/mictadlo/projects/mgo/chemeo/chemeo.go:19 +0xd8
main.main()
/media/mictadlo/projects/mgo/chemeo/chemeo.go:54 +0xa3
goroutine 2 [syscall]:
created by runtime.main
/usr/local/go/src/pkg/runtime/proc.c:221
exit status 2
What did I do wrong?
答案1
得分: 12
你的c2
变量保存的是无效的JSON:
c2 := "{" +
`"name" : "silicon",` +
`"mw" : 32.1173,` +
`}` +
`"index" : [` +
` {"name" : "mw", "value" : 32.1173}` +
`]` +
`}`
清理后,它应该是这样的:
c2 := `{
"name" : "silicon",
"mw" : 32.1173,
}
"index" : [
{"name" : "mw", "value" : 32.1173}
]
}`
你可以看到中间多了一个}
。
它应该是这样的:
c2 := `{
"name": "silicon",
"mw": 32.1173,
"index": [
{
"name": "mw",
"value": 32.1173
}
]
}`
英文:
Your c2
variable is holding invalid JSON:
c2 := "{" +
`"name" : "silicon",` +
`"mw" : 32.1173,` +
`}` +
`"index" : [` +
` {"name" : "mw", "value" : 32.1173}` +
`]` +
`}`
Cleaned up, it'll look like this:
c2 := `{
"name" : "silicon",
"mw" : 32.1173,
}
"index" : [
{"name" : "mw", "value" : 32.1173}
]
}`
You can see there's an extra }
in the middle.
It should look like this:
c2 := `{
"name": "silicon",
"mw": 32.1173,
"index": [
{
"name": "mw",
"value": 32.1173
}
]
}`
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论