gpt4 book ai didi

json - 可以使用 panic/recover 作为测试成功类型断言的方法吗?

转载 作者:IT王子 更新时间:2023-10-29 01:22:14 25 4
gpt4 key购买 nike

我一直在研究一种尝试解析嵌套 JSON 响应而不将信息映射到预定义结构的方法。

它返回一个空白界面:

map[name:My Folder parentId:1 created:2014-10-09T16:32:07+0000 deleted:false description:Sync Dir id:3 links:[map[rel:self entity:folder href:https://web.domain.org/rest/folders/3 id:3] map[href:https://web.domain.org/rest/folders/1 id:1 rel:parent entity:folder] map[entity:user href:https://web.domain.org/rest/users/1 id:1 rel:creator]] modified:2014-12-18T18:07:01+0000 permalink:https://web.domain.org/w/SpJYGQkv syncable:true type:d userId:1]

So I'm using the following to navigate this information:

func NFind(input interface{}, refs...interface{}) (output interface{}) {
defer func() {if r := recover(); r != nil { output = nil }}()

for _, ref := range refs {
switch cur := ref.(type) {
case string:
output = input.(map[string]interface{})[cur]
case int:
output = input.([]interface{})[cur]
}
}
return output
}

func NMap(input interface{}) (output map[string]interface{}) {
defer func() {if r := recover(); r != nil {}}()
if input == nil { return nil }
return input.(map[string]interface{})
}

func NArray(input interface{}) (output []interface{}) {
defer func() {if r := recover(); r != nil {}}()
if input == nil { return nil }
return input.([]interface{})
}

func NString(input interface{}) (output string) {
defer func() {if r := recover(); r != nil {}}()
if input == nil { return "" }
return input.(string)
}

func NFloat64(input interface{}) (output float64) {
defer func() {if r := recover(); r != nil {}}()
if input == nil { return 0 }
return input.(float64)
}

这是从 JSON 字符串解析信息的一种可接受的方法,还是有更可取的方法?

下面是使用上面解析出我当前使用的正确信息的例子:

func mapCache(input map[string]interface{}, valType string) {
fmt.Println(input)
var (
name string
href string
rel string
links []interface{}
myMap map[string]interface{}
)

if name = NString(NFind(input, "name")); name == "" { return }
if links = NArray(NFind(input, "links")); links == nil { return }

for i := 0; i < len(links); i++ {
if myMap = NMap(links[i]); myMap == nil { return }
if rel = NString(myMap["rel"]); rel == "" { return }
if rel == "self" {
if href = NString(myMap["href"]); href == "" { return }
}
}
CacheDB.Set(valType, name, href, false)
}

任何见解将不胜感激!谢谢!

最佳答案

检查 the specification for type assertions :

A type assertion used in an assignment or initialization of the special form

v, ok = x.(T)
v, ok := x.(T)
var v, ok = x.(T)

yields an additional untyped boolean value. The value of ok is true if the assertion holds. Otherwise it is false and the value of v is the zero value for type T. No run-time panic occurs in this case.

这比使用错误处理来检查类型更快、更简单。

所以你可以重写

func NMap(input interface{}) map[string]interface{} {
defer func() {if r := recover(); r != nil {}}()
if input == nil { return nil }
return input.(map[string]interface{})
}

作为

func NMap(input interface{}) map[string]interface{} {
if m, ok := input.(map[string]interface{}); ok {
return m
}
return nil
}

您也可以考虑像 github.com/zazab/zhash 这样的库使 map[string]interface{} 更易于使用。或者,当然,尝试找出 encoding/json 的现有模式之一如何做到这一点。

关于json - 可以使用 panic/recover 作为测试成功类型断言的方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27577610/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com