在Go中使用JSON时出现恐慌

huangapple go评论117阅读模式
英文:

panic with JSON in go

问题

我尝试运行以下代码

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. /*"labix.org/v2/mgo"
  6. "labix.org/v2/mgo/bson"*/
  7. )
  8. func insertEntry(j *map[string]interface{}, entry string) {
  9. err := json.Unmarshal([]byte(entry), j)
  10. if err != nil {
  11. panic(err)
  12. }
  13. }
  14. func main() {
  15. c1 := "{" +
  16. `"mw" : 42.0922,` +
  17. `"ΔfH°gas" : {` +
  18. ` "value" : 372.38,` +
  19. ` "units" : "kJ/mol"` +
  20. `},` +
  21. `"S°gas" : {` +
  22. ` "value" : 216.81,` +
  23. ` "units" : "J/mol×K"` +
  24. `},` +
  25. `"index" : [` +
  26. ` {"name" : "mw", "value" : 42.0922},` +
  27. ` {"name" : "ΔfH°gas", "value" : 372.38},` +
  28. ` {"name" : "S°gas", "value" : 216.81}` +
  29. `]` +
  30. `}`
  31. c2 := "{" +
  32. `"name" : "silicon",` +
  33. `"mw" : 32.1173,` +
  34. `}` +
  35. `"index" : [` +
  36. ` {"name" : "mw", "value" : 32.1173}` +
  37. `]` +
  38. `}`
  39. var m map[string]interface{}
  40. insertEntry(&m, c1)
  41. insertEntry(&m, c2)
  42. chemical := m["ΔfH°gas"].(map[string]interface{})
  43. fmt.Println("value: %s\n", chemical["value"].(string))
  44. fmt.Println("units: %s\n", chemical["units"].(string))

But I got the following error message:

  1. $ go run chemeo.go
  2. panic: invalid character '}' looking for beginning of object key string
  3. goroutine 1 [running]:
  4. main.insertEntry(0xf840045100, 0x4badc4, 0x7f5e00000056, 0x20043115c)
  5. /media/mictadlo/projects/mgo/chemeo/chemeo.go:19 +0xd8
  6. main.main()
  7. /media/mictadlo/projects/mgo/chemeo/chemeo.go:54 +0xa3
  8. goroutine 2 [syscall]:
  9. created by runtime.main
  10. /usr/local/go/src/pkg/runtime/proc.c:221
  11. exit status 2

What did I do wrong?

英文:

I tried to run the following code

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. /*"labix.org/v2/mgo"
  6. "labix.org/v2/mgo/bson"*/
  7. )
  8. func insertEntry(j *map[string]interface{}, entry string) {
  9. err := json.Unmarshal([]byte(entry), j)
  10. if err != nil {
  11. panic(err)
  12. }
  13. }
  14. func main() {
  15. c1 := "{" +
  16. `"mw" : 42.0922,` +
  17. `"ΔfH°gas" : {` +
  18. ` "value" : 372.38,` +
  19. ` "units" : "kJ/mol"` +
  20. `},` +
  21. `"S°gas" : {` +
  22. ` "value" : 216.81,` +
  23. ` "units" : "J/mol×K"` +
  24. `},` +
  25. `"index" : [` +
  26. ` {"name" : "mw", "value" : 42.0922},` +
  27. ` {"name" : "ΔfH°gas", "value" : 372.38},` +
  28. ` {"name" : "S°gas", "value" : 216.81}` +
  29. `]` +
  30. `}`
  31. c2 := "{" +
  32. `"name" : "silicon",` +
  33. `"mw" : 32.1173,` +
  34. `}` +
  35. `"index" : [` +
  36. ` {"name" : "mw", "value" : 32.1173}` +
  37. `]` +
  38. `}`
  39. var m map[string]interface{}
  40. insertEntry(&m, c1)
  41. insertEntry(&m, c2)
  42. chemical := m[&quotfH°gas"].(map[string]interface{})
  43. fmt.Println("value: %s\n", chemical["value"].(string))
  44. fmt.Println("units: %s\n", chemical["units"].(string))

But I got the following error message:

  1. $ go run chemeo.go
  2. panic: invalid character '}' looking for beginning of object key string
  3. goroutine 1 [running]:
  4. main.insertEntry(0xf840045100, 0x4badc4, 0x7f5e00000056, 0x20043115c)
  5. /media/mictadlo/projects/mgo/chemeo/chemeo.go:19 +0xd8
  6. main.main()
  7. /media/mictadlo/projects/mgo/chemeo/chemeo.go:54 +0xa3
  8. goroutine 2 [syscall]:
  9. created by runtime.main
  10. /usr/local/go/src/pkg/runtime/proc.c:221
  11. exit status 2

What did I do wrong?

答案1

得分: 12

你的c2变量保存的是无效的JSON:

  1. c2 := "{" +
  2. `"name" : "silicon",` +
  3. `"mw" : 32.1173,` +
  4. `}` +
  5. `"index" : [` +
  6. ` {"name" : "mw", "value" : 32.1173}` +
  7. `]` +
  8. `}`

清理后,它应该是这样的:

  1. c2 := `{
  2. "name" : "silicon",
  3. "mw" : 32.1173,
  4. }
  5. "index" : [
  6. {"name" : "mw", "value" : 32.1173}
  7. ]
  8. }`

你可以看到中间多了一个}

它应该是这样的:

  1. c2 := `{
  2. "name": "silicon",
  3. "mw": 32.1173,
  4. "index": [
  5. {
  6. "name": "mw",
  7. "value": 32.1173
  8. }
  9. ]
  10. }`
英文:

Your c2 variable is holding invalid JSON:

  1. c2 := "{" +
  2. `"name" : "silicon",` +
  3. `"mw" : 32.1173,` +
  4. `}` +
  5. `"index" : [` +
  6. ` {"name" : "mw", "value" : 32.1173}` +
  7. `]` +
  8. `}`

Cleaned up, it'll look like this:

  1. c2 := `{
  2. "name" : "silicon",
  3. "mw" : 32.1173,
  4. }
  5. "index" : [
  6. {"name" : "mw", "value" : 32.1173}
  7. ]
  8. }`

You can see there's an extra } in the middle.

It should look like this:

  1. c2 := `{
  2. "name": "silicon",
  3. "mw": 32.1173,
  4. "index": [
  5. {
  6. "name": "mw",
  7. "value": 32.1173
  8. }
  9. ]
  10. }`

huangapple
  • 本文由 发表于 2013年3月14日 07:34:48
  • 转载请务必保留本文链接:https://go.coder-hub.com/15398559.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定