diff options
Diffstat (limited to 'README.md')
-rw-r--r-- | README.md | 121 |
1 files changed, 109 insertions, 12 deletions
@@ -1,23 +1,120 @@ # JSON parsing library -This library is an marshaler/unmarshaler for JSON in a tree of nodes. Also allows you to make queries over these trees. +Библиотека для разбора JSON в дерево объектов. Так же позволяет выполнять поисковые запросы над ними. -## Library interface +## Использование ```go -package json // import "go.neonxp.dev/json" +import "go.neonxp.dev/json" -// Marshal Node tree to []byte -func Marshal(node *model.Node) ([]byte, error) +jsonString := `{ + "string key": "string value", + "number key": 123.321, + "bool key": true, + "object": { + "one": "two", + "object 2": { + "three": "four" + } + }, + "array": [ + "one", + 2, + true, + null, + { + "five": "six" + } + ] +}` -// Unmarshal data to Node tree -func Unmarshal(data []byte) (*model.Node, error) +j := json.New(std.Factory) // в качестве фабрики можно передавать имплементацию интерфейса NodeFactory +rootNode, err := j.Unmarshal(jsonString) -// Query returns node by query string (dot notation) -func Query(json string, query string) (*model.Node, error) +// Запрос по получившемуся дереву узлов +found := json.MustQuery(rootNode, []string{ "array", "4", "five" }) // == six +``` + +В результате `rootNode` будет содержать: + +```go +std.ObjectNode{ + "string key": &std.StringNode{ "string value" }, + "number key": &std.NumberNode{ 123.321 }, + "bool key": &std.BoolNode{ true }, + "object": std.ObjectNode{ + "one": &std.StringNode{ "two" }, + "object 2": std.ObjectNode{ + "three": &std.StringNode{ "four" }, + }, + }, + "array": &std.ArrayNode{ + &std.StringNode{ "one" }, + &std.NumberNode{ 2 }, + &std.BoolNode{ true }, + &std.NullNode{}, + std.ObjectNode{ + "five": &std.StringNode{ "six" }, + }, + }, +}, +``` + +## Своя фабрика + +``` +// Непосредственно фабрика возвращающая заготовки нужного типа +type NodeFactory func(typ NodeType) (Node, error) + +type Node interface { + String() string +} + +// Имплементация узла объекта +type ObjectNode interface { + Node + SetKetValue(k string, v Node) + GetByKey(k string) (Node, bool) +} + +// Имлементация узла массива +type ArrayNode interface { + Node + Append(v Node) + Index(i int) Node + Len() int +} + +// Имплементация узла строки +type StringNode interface { + Node + SetString(v string) + GetString() string +} + + +// Имплементация узла числа +type NumberNode interface { + Node + SetNumber(v float64) + GetNumber() float64 +} + +// Имплементация узла булевого типа +type BooleanNode interface { + Node + SetBool(v bool) + GetBool() bool +} + +// Имплементация null +type NullNode interface { + Node +} -// QueryArray returns node by array query -func QueryArray(json string, query []string) (*model.Node, error) +// Если узел имплементирует этот интерфейс то вызывается метод Parent передающий родительский узел +type AcceptParent interface { + Parent(n Node) +} ``` -Other methods: https://pkg.go.dev/go.neonxp.dev/json
\ No newline at end of file |