doudou3213 2015-08-20 15:55
浏览 213
已采纳

在golang中解析没有索引名称的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条回答 默认 最新

  • dongwh1992 2015-08-20 16:28
    关注

    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>

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 PointNet++的onnx模型只能使用一次
  • ¥20 西南科技大学数字信号处理
  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。