duangan1945 2015-03-13 20:56
浏览 109
已采纳

使用golang的encoding / json读取嵌套的json数据

I can't get the correct definition for my structs to capture the nested json data saved in a variable. My code snippet is as below:

package main

import "fmt"
import "encoding/json"

type Data struct {
    P string `json:"ports"`
    Ports struct {
         Portnums []int
    }
    Protocols []string `json:"protocols"`
}

func main() {
        y := `{
                "ports": {
            "udp": [
                1, 
                30
            ], 
            "tcp": [
                100, 
                1023
            ]
            }, 
            "protocols": [
            "tcp", 
            "udp"
            ]
    }`
    var data Data
    e := json.Unmarshal([]byte(y), &data)
    if e == nil {
        fmt.Println(data)
    } else {
        fmt.Println("Failed:", e)
    }

}

$ go run foo.go 
Failed: json: cannot unmarshal object into Go value of type string
  • 写回答

1条回答 默认 最新

  • doudansui6650 2015-03-13 21:18
    关注

    This works for me (see comment to your question above) <kbd>GoPlay</kbd>

    type Data struct {
        Ports struct {
            Tcp []float64 `json:"tcp"`
            Udp []float64 `json:"udp"`
        } `json:"ports"`
        Protocols []string `json:"protocols"`
    }
    
    func main() {
        y := `{
                    "ports": {
                "udp": [
                    1, 
                    30
                ], 
                "tcp": [
                    100, 
                    1023
                ]
                }, 
                "protocols": [
                "tcp", 
                "udp"
                ]
        }`
        d := Data{}
        err := json.Unmarshal([]byte(y), &d)
        if err != nil {
            fmt.Println("Error:", err.Error())
        } else {
            fmt.Printf("%#+v", d)
        }
    
    }
    

    OUTPUT

    main.Data{
        Ports:struct { 
            Tcp []float64 "json:\"tcp\"";
            Udp []float64 "json:\"udp\"" 
        }{
            Tcp:[]float64{100, 1023},
            Udp:[]float64{1, 30}
        },
        Protocols:[]string{"tcp", "udp"}
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀
  • ¥20 手写数字识别运行c仿真时,程序报错错误代码sim211-100
  • ¥15 关于#hadoop#的问题