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  }