我正在尝试验证Go中的JSON对象。我试图查看'tags'属性是否为数组。(稍后,我也想知道另一个属性是否也是一个对象)。

我已经做到了。如果我打印reflect.TypeOf(gjson.Get(api_spec, "tags").Value()我得到:

string   // When the field is a string
[]interface {} // When the field is an array
map[string]interface {} // When the field is an object

但是,当尝试在下面的代码上对此进行测试时:
if ( gjson.Get(api_spec, "tags").Exists() ) {
            if ( reflect.TypeOf(gjson.Get(api_spec, "tags").Value()) != "[]interface {}" ) {
             // some code here ...
            }
        }

我得到以下错误代码:
invalid operation: reflect.TypeOf(gjson.Get(api_spec, "tags").Value()) != "[]interface {}" (mismatched types reflect.Type and string)

提前致谢!

最佳答案

使用type assertion来确定值是否是[]interface{}:

v := gjson.Get(api_spec, "tags").Value()
_, ok := v.([]interface{}) // ok is true if v is type []interface{}

这是问题中修改为使用类型断言的代码:
if gjson.Get(api_spec, "tags").Exists() {
    if _, ok := gjson.Get(api_spec, "tags").Value().([]interface{}); !ok {
        // some code here ...
    }
}

无需使用反射。如果您确实出于某种原因想要使用反射(并且我在问题中没有看到原因),请比较reflect.Type值:
// Get type using a dummy value. This can be done once by declaring
// the variable as a package-level variable.
var sliceOfInterface = reflect.TypeOf([]interface{}{})

ok = reflect.TypeOf(v) == sliceOfInterface  // ok is true if v is type []interface{}

run the code on the playground

关于arrays - 在Go中测试值的类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/48286352/

10-12 06:45