Parsing json without index name in golang

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

Parsing json without index name in golang

问题

我有一个以以下格式的JSON数据:

  1. {
  2. "status_code": 200,
  3. "status_message": "OK",
  4. "response": {
  5. "Messages": [
  6. "CODE_NOT_AVAILABLE"
  7. ],
  8. "UnknownDevices": {
  9. "": [
  10. "6",
  11. "7",
  12. "8",
  13. "9",
  14. "10"
  15. ]
  16. }
  17. }
  18. }

我们可以看到在UnknownDevices之后缺少一个索引键,我正在尝试使用golang解组这个JSON数据,代码如下:

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. type pushWooshResponse struct {
  7. Status int `json:"status_code"`
  8. Status_msg string `json:"status_message"`
  9. Response response
  10. }
  11. type response struct {
  12. Message []string `json:"Messages"`
  13. UnknownDevices devices
  14. }
  15. type devices struct {
  16. Udevices []string `json:""`
  17. }
  18. func main() {
  19. itemInfoR := `{"status_code":200,"status_message":"OK","response":{"Messages":["CODE_NOT_AVAILABLE"],"UnknownDevices":{"devices":["6","7","8","9","10"]}}}`
  20. itemInfoBytes := []byte(itemInfoR)
  21. var ItemInfo pushWooshResponse
  22. er := json.Unmarshal(itemInfoBytes, &ItemInfo)
  23. if er != nil {
  24. fmt.Println("Error", er.Error())
  25. } else {
  26. fmt.Println(ItemInfo)
  27. }
  28. }

输出结果为:

  1. {200 OK {[CODE_NOT_AVAILABLE] {[]}}}

除了最后一部分,其他都正常工作,我无法解组最后一部分的JSON数据。你能帮我解组JSON数据的最后一部分吗?

英文:

I have a json in the following format

  1. {
  2. "status_code": 200,
  3. "status_message": "OK",
  4. "response": {
  5. "Messages": [
  6. "CODE_NOT_AVAILABLE"
  7. ],
  8. "UnknownDevices": {
  9. "": [
  10. "6",
  11. "7",
  12. "8",
  13. "9",
  14. "10"
  15. ]
  16. }
  17. }
  18. }

As we see we are missing one index key, after unknownDevices, i am trying to unmarshal this json using golan in the following way

  1. package main
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. )
  6. type pushWooshResponse struct {
  7. Status int `json:"status_code"`
  8. Status_msg string `json:"status_message"`
  9. Response response
  10. }
  11. type response struct {
  12. Message []string `json:"Messages"`
  13. UnknownDevices devices
  14. }
  15. type devices struct {
  16. Udevices []string `json:""`
  17. }
  18. func main() {
  19. itemInfoR := `{"status_code":200,"status_message":"OK","response":{"Messages":["CODE_NOT_AVAILABLE"],"UnknownDevices":{"devices":["6","7","8","9","10"]}}}`
  20. itemInfoBytes := []byte(itemInfoR)
  21. var ItemInfo pushWooshResponse
  22. er := json.Unmarshal(itemInfoBytes, &ItemInfo)
  23. if er != nil {
  24. fmt.Println("Error", er.Error())
  25. } else {
  26. fmt.Println(ItemInfo)
  27. }
  28. }

Output is

  1. {200 OK {[CODE_NOT_AVAILABLE] {[]}}}

Everything is working fine except for the last part, which i am not able to unmarshall this. Can you help me out to umarshal the last part of the json.

答案1

得分: 5

可能还有其他选项,但是每当你看到奇怪的 JSON 时,你总是可以回退到通过实现 json.Unmarshaler 和/或 json.Marshaler 来实现自定义的(反)编组。

也许可以这样做:

  1. type devices struct {
  2. Udevices []string
  3. }
  4. func (d *devices) UnmarshalJSON(b []byte) error {
  5. var x map[string][]string
  6. err := json.Unmarshal(b, &x)
  7. if err == nil {
  8. // 可以检查映射中是否只存在一个键
  9. d.Udevices = x[""]
  10. }
  11. return err
  12. }
  13. func (d devices) MarshalJSON() ([]byte, error) {
  14. x := map[string][]string{"": d.Udevices}
  15. return json.Marshal(x)
  16. }

Playground

英文:

There may be other options, but whenever you see strange JSON you can always fall back to implementing your own custom (un)marshalling by implementing json.Unmarshaler and/or json.Marshaler.

Perhaps something like:

  1. type devices struct {
  2. Udevices []string
  3. }
  4. func (d *devices) UnmarshalJSON(b []byte) error {
  5. var x map[string][]string
  6. err := json.Unmarshal(b, &x)
  7. if err == nil {
  8. // perhaps check that only a single
  9. // key exists in the map as well
  10. d.Udevices = x[""]
  11. }
  12. return err
  13. }
  14. func (d devices) MarshalJSON() ([]byte, error) {
  15. x := map[string][]string{"": d.Udevices}
  16. return json.Marshal(x)
  17. }

<kbd>Playground</kbd>

huangapple
  • 本文由 发表于 2015年8月20日 23:55:23
  • 转载请务必保留本文链接:https://go.coder-hub.com/32122902.html
匿名

发表评论

匿名网友

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

确定