代码之家  ›  专栏  ›  技术社区  ›  Mohsen Kamrani

在解组到映射[string]接口{}失败后,将断言键入ma[string][]string

  •  0
  • Mohsen Kamrani  · 技术社区  · 6 年前

    无法断言该类型 map[string][]string 解封后 map[string]interface{} . Here 下面是一个小片段来重现这个问题:

    package main
    
    import (
        "encoding/json"
        "fmt"
    )
    
    type Test struct {
        M map[string][]string `json:"m"`
    }
    
    func main() {
        b := []byte(`{"m":{}}`) //m will always exist but it might be empty or have some values. No difference if me is not empty, e.g. `{"m":{"s": ["abc"]}}`
    
        var test Test
        json.Unmarshal(b, &test) // This is fine, but for some reason I have to unmarshal to map[string]interface{}
        fmt.Println(test)
    
        var raw map[string]interface{}
        json.Unmarshal(b, &raw)
        test2 := Test{}
        test2.M = raw["m"].(map[string][]string) // error here
        fmt.Println(test2)
    }
    

    我得到了这个错误:

    interface {} is map[string]interface {}, not map[string][]string
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Burak Serdar    6 年前

    将json解组到接口{}时,结果是一个由以下内容组成的树:

    • 为json对象映射[string]接口{},
    • []用于json数组的接口{},以及
    • 字符串,float64,bool,json。数字,或值为零。

    在你解开马歇尔之后。 raw["m"] 是一个映射[string]接口{},其值为[]接口{}。然后可以将每个值断言为字符串:

    for k,v:= range raw["m"].(map[string]interface{}) {
       for _,x:=range v.([]interface{}); {
          test2.M[k]=append(test2.M[k],x.(string))
       }
    }