Parsing json without index name in golang

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

Parsing json without index name in golang

问题

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

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

我们可以看到在UnknownDevices之后缺少一个索引键,我正在尝试使用golang解组这个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数据。你能帮我解组JSON数据的最后一部分吗?

英文:

I have a json in the following format

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

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

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)
	}
}

Output is

{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 来实现自定义的(反)编组。

也许可以这样做:

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 {
        // 可以检查映射中是否只存在一个键
        d.Udevices = x[""]
    }
    return err
}

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

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:

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)
}

<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:

确定