【问题标题】:How to convert string from interface to []string in golang?如何在golang中将字符串从接口转换为[]字符串?
【发布时间】:2016-05-19 16:36:22
【问题描述】:

我正在解析一个包含字符串数组的 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"]

我试图将 data["aString"] 转换为 []string 以便能够循环它,但它失败了:

 test := []string(data["aString"]).([]string)
 fmt.Println(test) // panic -> interface conversion: 
                   //          interface is string, not []string

如何转换data["aString"]


编辑:

我没有正确表达自己。如果我打印data,我有这样的地图:

map[aString:["BBB-222","AAA-111"] whatever:ccc]

我想循环 aString (操作每个数组条目)。但我找不到方法,因为 aString 是 type interface {}

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

这就是我想转换aString的原因。我不想将 看起来像 数组的字符串转换为数组。

【问题讨论】:

  • 你知道你的 JSON 的确切结构吗? (这些字段是否明确定义或可能会有所不同)
  • 您的 var ii 应该已经是 map[string]interface {}... 我认为没有理由进行类型断言 data := ii.(map[string]interface {})。修复它并不能解决您的问题,我刚刚注意到它。
  • 试试这个aStringValue := ii.(map[string]interface {})["aString"]

标签: go


【解决方案1】:

我建议您总体上远离此实现。您的 json 可能会有所不同,但您可以轻松使用对象并避免所有此类不安全的废话。

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

aInterface := data["aString"].([]interface{})
aString := make([]string, len(aInterface))
for i, v := range aInterface {
    aString[i] = v.(string)
}

【讨论】:

  • @jérôme,我支持 Evan,但如果您确实需要将 JSON 数据解组到地图(有有效的用例),请考虑使用 mxj package。跨度>
  • 但这正是问题所在......我无法循环遍历data["aString"],因为它是type interface {}
  • @Jérôme 啊,好的。所以首先你必须在interface{}[]interface{} 上输入断言,我可以编辑我的答案来反映这一点。
  • 请将第二个数据["aString"] 更新为aInterface。然后它就可以工作了:-)
  • @evanmcdonnal,相当不错的代码块,但有一个小错误,您附加到 aString 数组,该数组已经分配到合适的大小。只需分配它:aString[i] = v.(string)playground
【解决方案2】:

这是你需要的吗?

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)
    }
}

查看Go Playground

【讨论】:

    【解决方案3】:

    对于另一种方法,您可以改用struct

    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}
    }
    

    【讨论】:

      猜你喜欢
      • 2016-02-28
      • 2017-09-25
      • 2014-12-17
      • 1970-01-01
      • 2015-02-25
      • 2014-02-27
      • 2019-05-03
      • 2017-01-19
      • 1970-01-01
      相关资源
      最近更新 更多