aboutsummaryrefslogtreecommitdiff
path: root/README.md
blob: 14fe2b1bc66c7a6d00a31c4ed3fbf9bb2a66ffad (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
# JSON parsing library

Библиотека для разбора JSON в дерево объектов. Так же позволяет выполнять поисковые запросы над ними.

## Использование

```go
import "go.neonxp.dev/json"

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"
        }
    ]
}`

j := json.New(std.Factory) // в качестве фабрики можно передавать имплементацию интерфейса NodeFactory
rootNode, err := j.Unmarshal(jsonString)

// Запрос по получившемуся дереву узлов
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 Factory interface {
    // Непосредственно фабрика возвращающая заготовки нужного типа
	Produce(typ NodeType) (Node, error)
    // Заполнение заготовки определенного типа соответствующим ей значением
	Fill(n Node, value any)
}

type Node interface {
    // Возвращает json представление узла
	ToJSON() string
}

type ObjectNode interface {
	Node
	Set(k string, v Node)
	Get(k string) (Node, bool)
}

type ArrayNode interface {
	Node
	Append(v Node)
	Index(i int) Node
	Len() int
}

type StringNode interface {
	Node
}

type NumberNode interface {
	Node
}

type BooleanNode interface {
	Node
}

type NullNode interface {
	Node
}

// Если узел имплементирует этот интерфейс то вызывается метод Parent передающий родительский узел
type AcceptParent interface {
	SetParent(n Node)
}
```

[Пример реализации самой простой фабрики и типов](/std/factory.go)