如何将接口中的字符串转换为golang中的[]字符串?

如何将接口中的字符串转换为golang中的[]字符串?,go,Go,我正在解析一个包含字符串数组的JSON对象: var ii interface{} json := "{\"aString\": [\"aaa_111\", \"bbb_222\"], \"whatever\":\"ccc\"}" err := json.Unmarshal([]byte(json), &ii) if err != nil { log.Fata

我正在解析一个包含字符串数组的JSON对象:

var ii interface{}
json := "{\"aString\": [\"aaa_111\", \"bbb_222\"], \"whatever\":\"ccc\"}"

err := json.Unmarshal([]byte(json), &ii)
if err != nil {
    log.Fatal(err)
}
data := ii.(map[string]interface{})
fmt.Println(data["aString"]) // outputs: ["aaa_111" "bbb_222"]
我试图将
数据[“aString”]
转换为[]字符串,以便能够在其上循环,但失败了:

 test := []string(data["aString"]).([]string)
 fmt.Println(test) // panic -> interface conversion: 
                   //          interface is string, not []string
如何转换
数据[“aString”]


编辑: 我没有恰当地表达自己。如果我打印
数据
,我有这样的地图:

map[aString:[“BBB-222”、“AAA-111”]无论什么:ccc]

我想在aString上循环(以操纵每个数组条目)。但是我找不到方法,因为aString是
类型接口{}

for i, v := range aString { // <-- fails
     // ...
     fmt.Println(i, v)
}

对于i,v:=range aString{/我建议您一般不要使用此实现。您的json可能会有所不同,但您可以轻松使用对象并避免所有此类不安全的废话

无论如何,该转换不起作用,因为切片中的类型不是
string
,它们也是
interface{}
。您必须迭代集合,然后对每个项执行类型断言,如下所示:

aInterface := data["aString"].([]interface{})
aString := make([]string, len(aInterface))
for i, v := range aInterface {
    aString[i] = v.(string)
}
这是你需要的吗

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    js := "{\"aString\": [\"aaa_111\", \"bbb_222\"], \"whatever\":\"ccc\"}"
    a := make(map[string]interface{})
    json.Unmarshal([]byte(js), &a)
    for _, v := range a["aString"].([]interface{}) {
        str := v.(string)
        fmt.Println(str)
    }
}

检查

对于另一种方法,您可以使用
结构

package main

import (
   "encoding/json"
   "fmt"
)

func main() {
   s := []byte(`{"aString": ["aaa_111", "bbb_222"], "whatever":"ccc"}`)
   var t struct {
      Astring []string
      Whatever string
   }
   json.Unmarshal(s, &t)
   fmt.Printf("%+v\n", t) // {Astring:[aaa_111 bbb_222] Whatever:ccc}
}

您知道JSON的确切结构吗?(字段是否定义得很好或可能有所不同)您的var
ii
应该已经是一个
map[string]接口{}
…我看不出有理由做类型断言
data:=ii.(map[string]接口{})
。修复这个问题并不能解决您的问题,我只是注意到了。试试这个
aStringValue:=ii。(map[string]interface{})[“aString”]
@jérôme,我同意Evan的说法,但是如果您真的需要将JSON数据解组到映射(这有有效的用例)因为这是<代码>数据> [代码] >因为它是“代码>类型接口{{} /代码> @ jj r r O.Me Ah,OK。首先,您必须在<代码>接口{S}< /Calp>中键入断言:<代码> []接口{} /代码>。我可以编辑我的答案来反映这一点。请更新第二个数据[ ASSTRIN ]作为一个接口。它可以工作:-)@evanmcdonnal,相当好的代码块,但有一个小错误,您将其附加到aString数组,该数组已经分配到了合适的大小。只需将其分配:
aString[i]=v.(string)