in json/parse.go [293:345]
func (p *Parser) stepValue(b []byte, retState state) ([]byte, bool, error) {
b = trimLeft(b)
if len(b) == 0 {
return b, false, nil
}
p.currentState = retState
c := b[0]
switch c {
case '{': // start dictionary
p.pushState(dictState)
return b[1:], false, p.visitor.OnObjectStart(-1, structform.AnyType)
case '[': // start array
p.pushState(arrState)
return b[1:], false, p.visitor.OnArrayStart(-1, structform.AnyType)
case 'n': // parse "null"
p.pushState(nullState)
p.required = 3
return p.stepNULL(b[1:])
case 'f': // parse "false"
p.pushState(falseState)
p.required = 4
return p.stepFALSE(b[1:])
case 't': // parse "true"
p.pushState(trueState)
p.required = 3
return p.stepTRUE(b[1:])
case '"': // parse string
p.literalBuffer = p.literalBuffer[:0]
p.pushState(stringState)
p.inEscape = false
return p.stepString(b[:])
default:
// parse number?
p.isDouble = false
isNumber := c == '-' || c == '+' || c == '.' || isDigit(c)
if !isNumber {
return b, false, errUnknownChar
}
p.literalBuffer = p.literalBuffer0[:0]
p.pushState(numberState)
p.isDouble = false
return p.stepNumber(b)
}
}