使用 Golang 将接口数组转换为字符串

5

我从远程源读取JSON数据并将其转换为映射。数据中有一些数组,我想检查其中的字符串值。在转换后,我认为m["t"]是一个接口数组。fmt.Print将其转换为控制台上的打印文本,但我无法想出一种简单的字符串比较方法。

if val[0] == "str-c" {fmt.Println("success")}

如何遍历它并进行字符串比较?
package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    var m map[string]interface{}
    sJSON := `{"k": "v", "t":["str-a","str-b","str-c"]}`
    _ = json.Unmarshal([]byte(sJSON),&m)

    // find out if one of the string values of "t" is "str-b"
    fmt.Println(m["t"]) 
}
1个回答

9

m["t"]interface{} 类型的完整数组。如果你想获取 str-b,它位于索引一处,你需要进行某些类型断言以将其作为字符串获取。以下是一个示例:https://play.golang.org/p/W7ZnMgicc7

如果你想在集合中检查它,代码如下:

package main

import (
    "fmt"
    "encoding/json"
)

func main() {
    var m map[string]interface{}
    sJSON := `{"k": "v", "t":["str-a","str-b","str-c"]}`
    _ = json.Unmarshal([]byte(sJSON),&m)

    // find out if one of the string values of "t" is "str-b"
    for _, v := range m["t"].([]interface{}) {
         if v.(string) == "str-b" {
              fmt.Println("match found!")
         }
    }
    //fmt.Println(m["t"].([]interface{})[1].(string)) 
}

https://play.golang.org/p/vo_90bKw92

如果您想避免这种'拆箱'的情况,我建议您这样做,可以定义一个结构体作为反序列化的目标,看起来像这样:

type MyStruct struct {
     K string `json:"k"`
     T []string `json:"t"`
}

那么您只需在不进行任何类型断言的情况下遍历T并执行比较即可,示例代码如下:https://play.golang.org/p/ehPxOygGf5


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接