英文:
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)
}
英文:
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)
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论