如何将接口中的字符串转换为golang中的[]字符串?
我正在解析一个包含字符串数组的JSON对象:如何将接口中的字符串转换为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
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的确切结构吗?(字段是否定义得很好或可能有所不同)您的varii
应该已经是一个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)