1
2
3
4
5 package mxj
6
7 import (
8 "bytes"
9 "encoding/json"
10 "fmt"
11 "io"
12 "time"
13 )
14
15
16
17
18
19
20 func (mv Map) Json(safeEncoding ...bool) ([]byte, error) {
21 var s bool
22 if len(safeEncoding) == 1 {
23 s = safeEncoding[0]
24 }
25
26 b, err := json.Marshal(mv)
27
28 if !s {
29 b = bytes.Replace(b, []byte("\\u003c"), []byte("<"), -1)
30 b = bytes.Replace(b, []byte("\\u003e"), []byte(">"), -1)
31 b = bytes.Replace(b, []byte("\\u0026"), []byte("&"), -1)
32 }
33 return b, err
34 }
35
36
37
38
39 func (mv Map) JsonIndent(prefix, indent string, safeEncoding ...bool) ([]byte, error) {
40 var s bool
41 if len(safeEncoding) == 1 {
42 s = safeEncoding[0]
43 }
44
45 b, err := json.MarshalIndent(mv, prefix, indent)
46 if !s {
47 b = bytes.Replace(b, []byte("\\u003c"), []byte("<"), -1)
48 b = bytes.Replace(b, []byte("\\u003e"), []byte(">"), -1)
49 b = bytes.Replace(b, []byte("\\u0026"), []byte("&"), -1)
50 }
51 return b, err
52 }
53
54
55
56
57
58
59 func (mv Map) JsonWriter(jsonWriter io.Writer, safeEncoding ...bool) error {
60 b, err := mv.Json(safeEncoding...)
61 if err != nil {
62 return err
63 }
64
65 _, err = jsonWriter.Write(b)
66 return err
67 }
68
69
70
71 func (mv Map) JsonWriterRaw(jsonWriter io.Writer, safeEncoding ...bool) ([]byte, error) {
72 b, err := mv.Json(safeEncoding...)
73 if err != nil {
74 return b, err
75 }
76
77 _, err = jsonWriter.Write(b)
78 return b, err
79 }
80
81
82
83 func (mv Map) JsonIndentWriter(jsonWriter io.Writer, prefix, indent string, safeEncoding ...bool) error {
84 b, err := mv.JsonIndent(prefix, indent, safeEncoding...)
85 if err != nil {
86 return err
87 }
88
89 _, err = jsonWriter.Write(b)
90 return err
91 }
92
93
94
95 func (mv Map) JsonIndentWriterRaw(jsonWriter io.Writer, prefix, indent string, safeEncoding ...bool) ([]byte, error) {
96 b, err := mv.JsonIndent(prefix, indent, safeEncoding...)
97 if err != nil {
98 return b, err
99 }
100
101 _, err = jsonWriter.Write(b)
102 return b, err
103 }
104
105
106
107
108
109
110
111
112 var JsonUseNumber bool
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128 func NewMapJson(jsonVal []byte) (Map, error) {
129
130 if len(jsonVal) == 0 {
131 m := make(map[string]interface{}, 0)
132 return m, nil
133 }
134
135 if jsonVal[0] == '[' {
136 jsonVal = []byte(`{"object":` + string(jsonVal) + `}`)
137 }
138 m := make(map[string]interface{})
139
140 buf := bytes.NewReader(jsonVal)
141 dec := json.NewDecoder(buf)
142 if JsonUseNumber {
143 dec.UseNumber()
144 }
145 err := dec.Decode(&m)
146 return m, err
147 }
148
149
150
151
152
153
154 func NewMapJsonReader(jsonReader io.Reader) (Map, error) {
155 jb, err := getJson(jsonReader)
156 if err != nil || len(*jb) == 0 {
157 return nil, err
158 }
159
160
161 return NewMapJson(*jb)
162 }
163
164
165
166
167
168
169 func NewMapJsonReaderRaw(jsonReader io.Reader) (Map, []byte, error) {
170 jb, err := getJson(jsonReader)
171 if err != nil || len(*jb) == 0 {
172 return nil, *jb, err
173 }
174
175
176 m, merr := NewMapJson(*jb)
177 return m, *jb, merr
178 }
179
180
181
182 func getJson(rdr io.Reader) (*[]byte, error) {
183 bval := make([]byte, 1)
184 jb := make([]byte, 0)
185 var inQuote, inJson bool
186 var parenCnt int
187 var previous byte
188
189
190
191 for {
192 _, err := rdr.Read(bval)
193 if err != nil {
194 if err == io.EOF && inJson && parenCnt > 0 {
195 return &jb, fmt.Errorf("no closing } for JSON string: %s", string(jb))
196 }
197 return &jb, err
198 }
199 switch bval[0] {
200 case '{':
201 if !inQuote {
202 parenCnt++
203 inJson = true
204 }
205 case '}':
206 if !inQuote {
207 parenCnt--
208 }
209 if parenCnt < 0 {
210 return nil, fmt.Errorf("closing } without opening {: %s", string(jb))
211 }
212 case '"':
213 if inQuote {
214 if previous == '\\' {
215 break
216 }
217 inQuote = false
218 } else {
219 inQuote = true
220 }
221 case '\n', '\r', '\t', ' ':
222 if !inQuote {
223 continue
224 }
225 }
226 if inJson {
227 jb = append(jb, bval[0])
228 if parenCnt == 0 {
229 break
230 }
231 }
232 previous = bval[0]
233 }
234
235 return &jb, nil
236 }
237
238
239
240
241
242 var jhandlerPollInterval = time.Duration(1e6)
243
244
245
246
247
248
249
250
251
252
253
254 func HandleJsonReader(jsonReader io.Reader, mapHandler func(Map) bool, errHandler func(error) bool) error {
255 var n int
256 for {
257 m, merr := NewMapJsonReader(jsonReader)
258 n++
259
260
261 if merr != nil && merr != io.EOF {
262 merr = fmt.Errorf("[jsonReader: %d] %s", n, merr.Error())
263 if ok := errHandler(merr); !ok {
264
265 return merr
266 }
267 continue
268 }
269
270
271 if len(m) != 0 {
272 if ok := mapHandler(m); !ok {
273 break
274 }
275 } else if merr != io.EOF {
276 <-time.After(jhandlerPollInterval)
277 }
278
279 if merr == io.EOF {
280 break
281 }
282 }
283 return nil
284 }
285
286
287
288
289
290
291
292
293 func HandleJsonReaderRaw(jsonReader io.Reader, mapHandler func(Map, []byte) bool, errHandler func(error, []byte) bool) error {
294 var n int
295 for {
296 m, raw, merr := NewMapJsonReaderRaw(jsonReader)
297 n++
298
299
300 if merr != nil && merr != io.EOF {
301 merr = fmt.Errorf("[jsonReader: %d] %s", n, merr.Error())
302 if ok := errHandler(merr, raw); !ok {
303
304 return merr
305 }
306 continue
307 }
308
309
310 if len(m) != 0 {
311 if ok := mapHandler(m, raw); !ok {
312 break
313 }
314 } else if merr != io.EOF {
315 <-time.After(jhandlerPollInterval)
316 }
317
318 if merr == io.EOF {
319 break
320 }
321 }
322 return nil
323 }
324
View as plain text