在golang

时间:2015-08-20 15:55:23

标签: json go

我有以下格式的json

{
    "status_code": 200,
    "status_message": "OK",
    "response": {
        "Messages": [
            "CODE_NOT_AVAILABLE"
        ],
        "UnknownDevices": {
            "": [
                "6",
                "7",
                "8",
                "9",
                "10"
            ]
        }
    }
}

正如我们所看到的那样,我们缺少一个索引键,在unknownDevices之后,我试图用以下方式使用golan解组这个json

package main

import (
    "encoding/json"
    "fmt"
)

type pushWooshResponse struct {
    Status     int    `json:"status_code"`
    Status_msg string `json:"status_message"`
    Response   response
}

type response struct {
    Message        []string `json:"Messages"`
    UnknownDevices devices
}

type devices struct {
    Udevices []string `json:""`
}

func main() {
    itemInfoR := `{"status_code":200,"status_message":"OK","response":{"Messages":["CODE_NOT_AVAILABLE"],"UnknownDevices":{"devices":["6","7","8","9","10"]}}}`
    itemInfoBytes := []byte(itemInfoR)
    var ItemInfo pushWooshResponse
    er := json.Unmarshal(itemInfoBytes, &ItemInfo)
    if er != nil {
        fmt.Println("Error", er.Error())
    } else {
        fmt.Println(ItemInfo)
    }
}

输出

{200 OK {[CODE_NOT_AVAILABLE] {[]}}}

除了最后一部分,一切都工作正常,我无法解决这个问题。你能帮我解决json的最后一部分。

1 个答案:

答案 0 :(得分:5)

可能还有其他选项,但每当您看到奇怪的JSON时,您都可以通过实施json.Unmarshaler和/或json.Marshaler来实施自己的自定义(联合)编组。

也许是这样的:

type devices struct {
    Udevices []string
}

func (d *devices) UnmarshalJSON(b []byte) error {
    var x map[string][]string
    err := json.Unmarshal(b, &x)
    if err == nil {
        // perhaps check that only a single
        // key exists in the map as well
        d.Udevices = x[""]
    }
    return err
}

func (d devices) MarshalJSON() ([]byte, error) {
    x := map[string][]string{"": d.Udevices}
    return json.Marshal(x)
}

Playground