Documentation
¶
Index ¶
- Constants
- Variables
- func SkipSpaces(b []byte, i int) int
- type Generator
- type Parser
- func (p *Parser) Break(b []byte, st, depth int) (i int, err error)
- func (p *Parser) DecodeString(b []byte, st int, buf []byte) (s []byte, i int, err error)
- func (p *Parser) DecodedStringLength(b []byte, st int) (n, i int, err error)
- func (p *Parser) Enter(b []byte, st int, typ byte) (i int, err error)
- func (p *Parser) ForMore(b []byte, i *int, typ byte, errp *error) bool
- func (p *Parser) Key(b []byte, st int) (k []byte, i int, err error)
- func (p *Parser) Length(b []byte, st int) (n, i int, err error)
- func (p *Parser) More(b []byte, st int, typ byte) (more bool, i int, err error)
- func (p *Parser) Raw(b []byte, st int) (v []byte, i int, err error)
- func (p *Parser) Skip(b []byte, st int) (i int, err error)
- func (p *Parser) SkipSpaces(b []byte, i int) int
- func (p *Parser) Type(b []byte, st int) (tp byte, i int, err error)
Examples ¶
Constants ¶
View Source
const ( None = 0 Null = 'n' Bool = 'b' String = 's' Array = '[' Object = '{' Number = 'N' )
Variables ¶
Functions ¶
func SkipSpaces ¶ added in v0.4.0
Types ¶
type Generator ¶ added in v0.4.0
type Generator struct{}
func (*Generator) EncodeString ¶ added in v0.4.0
func (*Generator) EncodeStringContent ¶ added in v0.4.0
type Parser ¶ added in v0.4.0
type Parser struct{}
Example ¶
package main
import (
"fmt"
"github.com/nikandfor/json"
)
func main() {
var p json.Parser
data := []byte(`{"key": "value", "another": 1234}`)
i := 0 // initial position
i, err := p.Enter(data, i, json.Object)
if err != nil {
// not an object
}
var key []byte // to not to shadow i and err in a loop
// extracted values
var value, another []byte
for p.ForMore(data, &i, json.Object, &err) {
key, i, err = p.Key(data, i) // key decodes a string but don't decode '\n', '\"', '\xXX' and others
if err != nil {
// ...
}
switch string(key) {
case "key":
value, i, err = p.DecodeString(data, i, value[:0]) // reuse value buffer if we are in a loop or something
case "another":
another, i, err = p.Raw(data, i)
default: // skip additional keys
i, err = p.Skip(data, i)
}
// check error for all switch cases
if err != nil {
// ...
}
}
if err != nil {
// ForMore error
}
fmt.Printf("key: %s\nanother: %s\n", value, another)
}
Output: key: value another: 1234
Example (MultipleValues) ¶
package main
import (
"fmt"
"github.com/nikandfor/json"
)
func main() {
var err error // to not to shadow i in a loop
var p json.Parser
data := []byte(`"a", 2 3
["array"]
`)
processOneObject := func(data []byte, st int) (int, error) {
raw, i, err := p.Raw(data, st)
fmt.Printf("value: %s\n", raw)
return i, err
}
for i := p.SkipSpaces(data, 0); i < len(data); i = p.SkipSpaces(data, i) { // eat trailing spaces and not try to read the value from string "\n"
i, err = processOneObject(data, i) // do not use := here as it shadow i and loop will restart from the same index
if err != nil {
// ...
}
}
}
Output: value: "a" value: 2 value: 3 value: ["array"]
func (*Parser) DecodeString ¶ added in v0.4.0
func (*Parser) DecodedStringLength ¶ added in v0.4.0
Click to show internal directories.
Click to hide internal directories.