解析动态的 JSON 对象

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

Parse dynamic json object

问题

我可以帮你解析这个 JSON 对象。你可以尝试以下方法:

首先,你可以使用以下结构体定义来解析 JSON:

type Ports struct {
    Port map[string]map[string]string `json:"ports"`
}

然后,你可以使用以下代码来解码 JSON 对象:

var requestBody Ports
decoder := json.NewDecoder(body)
err := decoder.Decode(&requestBody)

这样,你就可以通过 requestBody.Port 来访问端口和对应的值了。

希望这对你有帮助!如果你还有其他问题,请随时提问。

英文:

How can I parse this json object:

{
    "ports": {
	    "0": {
    	    "3306": "3306"
	    },
	    "1": {
		    "3307": "9908"
	    }
    }
}

I can have N ports, and the values for each port will always be a key:value pair.

So far I've tried this:

type Ports struct {
    Port map[string]string
}

With this I get the keys (0, 1) but the values are empty.

I also tried this:

type Ports struct {
    Port map[string]struct{
        Values map[string]string
    }
}

But also not working.

This is how I am decoding the json object:

var requestBody Ports
decoder := json.NewDecoder(body)
err := decoder.Decode(&requestBody)

答案1

得分: 3

使用以下类型:

type Ports struct {
    Ports map[string]map[string]string
}

playground示例

注意:

  • 字段名称必须匹配。我使用字段名"Ports"来匹配JSON文本中使用的名称。
  • Go类型在JSON中应具有相同的嵌套级别。结构体和映射各自计为一级嵌套。第一次尝试没有足够的嵌套,第二次尝试有一个多余的嵌套级别(带有Values字段的结构体)。
英文:

Use this type:

type Ports struct {
    Ports map[string]map[string]string
}

playground example

Notes:

  • The field names much match. I used field name "Ports" to match the name used in the JSON text.
  • The Go types should have the same level of nesting in the JSON. A struct and map each count for one level of nesting. The first attempt does not have enough nesting, the second attempt has one too many levels of nesting (the struct with Values field).

答案2

得分: 1

你可以像这样解析它。

https://play.golang.org/p/09VDJidAVs

type Ports struct {
    Ports map[string]*Port `json:"ports"`
}

type Port map[string]string


func main() {
    p := &Ports{}
    err := json.Unmarshal([]byte(ports), p)
    if err != nil {
        fmt.Println(err)
        return
    }
    
    // 使用
    
    // 如果你需要按照数字值排序,将键获取到一个切片中
    keys := make([]string, 0, len(p.Ports))
    for k, _ := range p.Ports {
        keys = append(keys, k)
    }
    // 在这里进行排序
    
    for i := range keys {
        fmt.Printf("%+v\n", p.Ports[keys[i]])
    }
    
    // 如果你不关心排序
    for _, v := range p.Ports {
        for k, v := range *v {
            fmt.Printf("%s: %s\n", k, v)
        }
    }
}
英文:

You can parse it like this.

https://play.golang.org/p/09VDJidAVs

type Ports struct {
	Ports map[string]*Port `json:"ports"`
}

type Port map[string]string
	

func main() {
	p := &Ports{}
	err := json.Unmarshal([]byte(ports),p)
	if err != nil {
		fmt.Println(err)
		return
	}
	
	// using
	
	// if you need to sort by the number value, get the keys in a slice
	keys := make([]string, 0, len(p.Ports))
	for k, _ := range p.Ports {
		keys = append(keys, k)
	}
	// sort here
	
	for i := range keys {
		fmt.Printf("%+v\n",p.Ports[keys[i]])
	}
	
	// if you don't care to sort
	for _, v := range p.Ports {
		for k, v := range *v {
			fmt.Printf("%s: %s\n", k,v)
		}
	}
}

huangapple
  • 本文由 发表于 2017年5月17日 05:29:44
  • 转载请务必保留本文链接:https://go.coder-hub.com/44011905.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定