aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
authorNeonXP <i@neonxp.dev>2022-12-27 02:37:02 +0300
committerNeonXP <i@neonxp.dev>2022-12-27 02:40:03 +0300
commit76a7f461ebbde70ea0e3d4f9b79c08139acaee7c (patch)
tree5e6dcb05f00be5109b3465ef16a6e9169a27497e /README.md
parent6f1d1df79f161cfc695f74d271d689ba72c44d09 (diff)
Completely rewritedv0.1.0
Diffstat (limited to 'README.md')
-rw-r--r--README.md121
1 files changed, 109 insertions, 12 deletions
diff --git a/README.md b/README.md
index a3cd9a7..a95038f 100644
--- a/README.md
+++ b/README.md
@@ -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