github.com/zhangdapeng520/zdpgo_json@v0.1.5/query/result_handler.go (about) 1 package query 2 3 // ForEach 遍历每个值 4 // 如果结果表示不存在的值,则不会迭代任何值。 5 // 如果结果是Object,迭代器将传递每个项的键和值。如果结果是Array,迭代器将只传递每一项的值。 6 // 如果结果不是JSON数组或对象,迭代器将返回一个等于结果的值。 7 func (t Result) ForEach(iterator func(key, value Result) bool) { 8 if !t.Exists() { 9 return 10 } 11 if t.Type != JSON { 12 iterator(Result{}, t) 13 return 14 } 15 json := t.Raw 16 var obj bool 17 var i int 18 var key, value Result 19 for ; i < len(json); i++ { 20 if json[i] == '{' { 21 i++ 22 key.Type = String 23 obj = true 24 break 25 } else if json[i] == '[' { 26 i++ 27 key.Type = Number 28 key.Num = -1 29 break 30 } 31 if json[i] > ' ' { 32 return 33 } 34 } 35 var str string 36 var vesc bool 37 var ok bool 38 var idx int 39 for ; i < len(json); i++ { 40 if obj { 41 if json[i] != '"' { 42 continue 43 } 44 s := i 45 i, str, vesc, ok = parseString(json, i+1) 46 if !ok { 47 return 48 } 49 if vesc { 50 key.Str = unescape(str[1 : len(str)-1]) 51 } else { 52 key.Str = str[1 : len(str)-1] 53 } 54 key.Raw = str 55 key.Index = s + t.Index 56 } else { 57 key.Num += 1 58 } 59 for ; i < len(json); i++ { 60 if json[i] <= ' ' || json[i] == ',' || json[i] == ':' { 61 continue 62 } 63 break 64 } 65 s := i 66 i, value, ok = parseAny(json, i, true) 67 if !ok { 68 return 69 } 70 if t.Indexes != nil { 71 if idx < len(t.Indexes) { 72 value.Index = t.Indexes[idx] 73 } 74 } else { 75 value.Index = s + t.Index 76 } 77 if !iterator(key, value) { 78 return 79 } 80 idx++ 81 } 82 }