1
1
package json
2
2
3
3
import (
4
+ "bytes"
4
5
"encoding/json"
5
6
"fmt"
6
7
"strconv"
@@ -16,15 +17,22 @@ type JSONParser struct {
16
17
DefaultTags map [string ]string
17
18
}
18
19
19
- func (p * JSONParser ) Parse (buf []byte ) ([]telegraf.Metric , error ) {
20
+ func (p * JSONParser ) parseArray (buf []byte ) ([]telegraf.Metric , error ) {
20
21
metrics := make ([]telegraf.Metric , 0 )
21
22
22
- var jsonOut map [string ]interface {}
23
+ var jsonOut [] map [string ]interface {}
23
24
err := json .Unmarshal (buf , & jsonOut )
24
25
if err != nil {
25
- err = fmt .Errorf ("unable to parse out as JSON, %s" , err )
26
+ err = fmt .Errorf ("unable to parse out as JSON Array , %s" , err )
26
27
return nil , err
27
28
}
29
+ for _ , item := range jsonOut {
30
+ metrics , err = p .parseObject (metrics , item )
31
+ }
32
+ return metrics , nil
33
+ }
34
+
35
+ func (p * JSONParser ) parseObject (metrics []telegraf.Metric , jsonOut map [string ]interface {}) ([]telegraf.Metric , error ) {
28
36
29
37
tags := make (map [string ]string )
30
38
for k , v := range p .DefaultTags {
@@ -44,7 +52,7 @@ func (p *JSONParser) Parse(buf []byte) ([]telegraf.Metric, error) {
44
52
}
45
53
46
54
f := JSONFlattener {}
47
- err = f .FlattenJSON ("" , jsonOut )
55
+ err : = f .FlattenJSON ("" , jsonOut )
48
56
if err != nil {
49
57
return nil , err
50
58
}
@@ -57,6 +65,21 @@ func (p *JSONParser) Parse(buf []byte) ([]telegraf.Metric, error) {
57
65
return append (metrics , metric ), nil
58
66
}
59
67
68
+ func (p * JSONParser ) Parse (buf []byte ) ([]telegraf.Metric , error ) {
69
+
70
+ if ! isarray (buf ) {
71
+ metrics := make ([]telegraf.Metric , 0 )
72
+ var jsonOut map [string ]interface {}
73
+ err := json .Unmarshal (buf , & jsonOut )
74
+ if err != nil {
75
+ err = fmt .Errorf ("unable to parse out as JSON, %s" , err )
76
+ return nil , err
77
+ }
78
+ return p .parseObject (metrics , jsonOut )
79
+ }
80
+ return p .parseArray (buf )
81
+ }
82
+
60
83
func (p * JSONParser ) ParseLine (line string ) (telegraf.Metric , error ) {
61
84
metrics , err := p .Parse ([]byte (line + "\n " ))
62
85
@@ -115,3 +138,13 @@ func (f *JSONFlattener) FlattenJSON(
115
138
}
116
139
return nil
117
140
}
141
+
142
+ func isarray (buf []byte ) bool {
143
+ ia := bytes .IndexByte (buf , '[' )
144
+ ib := bytes .IndexByte (buf , '{' )
145
+ if ia > - 1 && ia < ib {
146
+ return true
147
+ } else {
148
+ return false
149
+ }
150
+ }
0 commit comments