├── README.md ├── cmd └── main.go ├── go.mod ├── jsonParser.go ├── src ├── lexer │ ├── lexer.go │ └── tokens.go └── parser │ └── parser.go └── testJsonBlob ├── test1.json ├── test2.json ├── test3.json ├── test4.json ├── test5.json ├── test6.json ├── test7.json ├── test8.json └── test9.json /README.md: -------------------------------------------------------------------------------- 1 | 2 | # Json Parser 3 | 4 | Json Parser from scratch in go 5 | 6 | ## Test Locally 7 | 8 | ### Clone the project 9 | `git clone https://github.com/KhushPatibandha/jsonParser.git` 10 | 11 | ### Navigate to the project directory 12 | `cd .\jsonParser\` 13 | 14 | ### Test 15 | `go run cmd/main.go` 16 | 17 | And paste your json blob. 18 | 19 | ## Use as a package 20 | 21 | ### Get the latest package 22 | `go get -u github.com/KhushPatibandha/jsonParser` 23 | 24 | ### Usage 25 | ` 26 | result, err := jsonparser.ParseIt() 27 | ` 28 | 29 | The method `jsonparser.ParseIt(jsonString)` takes in a `string` and returns `interface{}, error` 30 | -------------------------------------------------------------------------------- /cmd/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "bytes" 6 | "fmt" 7 | "os" 8 | "strings" 9 | 10 | jsonparser "github.com/KhushPatibandha/jsonParser" 11 | ) 12 | 13 | func main() { 14 | var buf bytes.Buffer 15 | reader := bufio.NewReader(os.Stdin) 16 | for { 17 | line, err := reader.ReadString('\n') 18 | if err != nil { 19 | fmt.Println("Error reading from console") 20 | return 21 | } 22 | line = strings.TrimSpace(line) 23 | if line == "" { 24 | break 25 | } 26 | buf.WriteString(line) 27 | } 28 | jsonString := buf.String() 29 | 30 | result, err := jsonparser.ParseIt(jsonString) 31 | if err != nil { 32 | panic(err) 33 | } 34 | fmt.Println(result) 35 | } 36 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/KhushPatibandha/jsonParser 2 | 3 | go 1.22.4 4 | -------------------------------------------------------------------------------- /jsonParser.go: -------------------------------------------------------------------------------- 1 | package jsonparser 2 | 3 | import ( 4 | "github.com/KhushPatibandha/jsonParser/src/lexer" 5 | "github.com/KhushPatibandha/jsonParser/src/parser" 6 | ) 7 | 8 | func ParseIt(jsonString string) (interface{}, error) { 9 | tokens := lexer.Tokenizer(jsonString) 10 | 11 | // for _, token := range tokens { 12 | // token.Debug() 13 | // } 14 | 15 | p := parser.NewParser(tokens) 16 | return p.Parse() 17 | } 18 | -------------------------------------------------------------------------------- /src/lexer/lexer.go: -------------------------------------------------------------------------------- 1 | package lexer 2 | 3 | import ( 4 | "fmt" 5 | "regexp" 6 | "strconv" 7 | "strings" 8 | "unicode/utf16" 9 | ) 10 | 11 | type regexHandler func(lex *lexer, regex *regexp.Regexp) 12 | 13 | type regexPattern struct { 14 | regex *regexp.Regexp 15 | handler regexHandler 16 | } 17 | 18 | type lexer struct { 19 | patterns []regexPattern 20 | Tokens []Token 21 | source string 22 | position int 23 | line int 24 | } 25 | 26 | func Tokenizer(source string) []Token { 27 | lexer := createLexer(source) 28 | for !lexer.atEOF() { 29 | matched := false 30 | for _, pattern := range lexer.patterns { 31 | lineOfCode := pattern.regex.FindStringIndex(lexer.remainder()) 32 | if lineOfCode != nil && lineOfCode[0] == 0 { 33 | pattern.handler(lexer, pattern.regex) 34 | matched = true 35 | break 36 | } 37 | } 38 | if !matched { 39 | panic(fmt.Sprintf("lexer error: unrecognized token '%v' near --> '%v'", lexer.remainder()[:1], lexer.remainder())) 40 | } 41 | } 42 | lexer.push(NewToken(EOF, "EOF")) 43 | return lexer.Tokens 44 | } 45 | 46 | func (lexer *lexer) advanceN(n int) { 47 | lexer.position += n 48 | } 49 | 50 | func (lexer *lexer) at() byte { 51 | return lexer.source[lexer.position] 52 | } 53 | 54 | func (lexer *lexer) advance() { 55 | lexer.position += 1 56 | } 57 | 58 | func (lexer *lexer) remainder() string { 59 | return lexer.source[lexer.position:] 60 | } 61 | 62 | func (lexer *lexer) push(token Token) { 63 | lexer.Tokens = append(lexer.Tokens, token) 64 | } 65 | 66 | func (lexer *lexer) atEOF() bool { 67 | return lexer.position >= len(lexer.source) 68 | } 69 | 70 | func createLexer(source string) *lexer { 71 | return &lexer{ 72 | position: 0, 73 | line: 1, 74 | source: source, 75 | Tokens: make([]Token, 0), 76 | patterns: []regexPattern{ 77 | {regexp.MustCompile(`[0-9]+(\.[0-9]+)?`), numberHandler}, 78 | {regexp.MustCompile(`\s+`), skipHandler}, 79 | {regexp.MustCompile(`"(?:\\.|[^"])*"`), stringHandler}, 80 | {regexp.MustCompile(`\[`), defaultHandler(LEFT_SQ_BRACKET, "[")}, 81 | {regexp.MustCompile(`\]`), defaultHandler(RIGHT_SQ_BRACKET, "]")}, 82 | {regexp.MustCompile(`\{`), defaultHandler(LEFT_CURLY_BRACKET, "{")}, 83 | {regexp.MustCompile(`\}`), defaultHandler(RIGHT_CURLY_BRACKET, "}")}, 84 | {regexp.MustCompile(`,`), defaultHandler(COMMA, ",")}, 85 | {regexp.MustCompile(`:`), defaultHandler(COLON, ":")}, 86 | {regexp.MustCompile(`-`), defaultHandler(DASH, "-")}, 87 | {regexp.MustCompile(`\+`), defaultHandler(PLUS, "+")}, 88 | {regexp.MustCompile(`[eE]`), defaultHandler(EXPONENT, "e")}, 89 | {regexp.MustCompile(`true`), defaultHandler(BOOLEAN, "true")}, 90 | {regexp.MustCompile(`false`), defaultHandler(BOOLEAN, "false")}, 91 | {regexp.MustCompile(`null`), defaultHandler(NULL, "null")}, 92 | }, 93 | } 94 | } 95 | 96 | func defaultHandler(k TokenKind, v string) regexHandler { 97 | return func(lex *lexer, regex *regexp.Regexp) { 98 | lex.push(NewToken(k, v)) 99 | lex.advanceN(len(v)) 100 | } 101 | } 102 | 103 | func numberHandler(lexer *lexer, regex *regexp.Regexp) { 104 | lexer.push(NewToken(NUMBER, regex.FindString(lexer.remainder()))) 105 | lexer.advanceN(len(regex.FindString(lexer.remainder()))) 106 | } 107 | 108 | func stringHandler(lexer *lexer, regex *regexp.Regexp) { 109 | match := regex.FindString(lexer.remainder()) 110 | stringLiteral := match[1 : len(match)-1] 111 | stringLiteral = handleEscapeCharacters(stringLiteral) 112 | lexer.push(NewToken(STRING, stringLiteral)) 113 | lexer.advanceN(len(match)) 114 | } 115 | 116 | func handleEscapeCharacters(s string) string { 117 | var result strings.Builder 118 | escape := false 119 | 120 | for i := 0; i < len(s); i++ { 121 | if escape { 122 | switch s[i] { 123 | case '"': 124 | result.WriteByte('"') 125 | case '\\': 126 | result.WriteByte('\\') 127 | case '/': 128 | result.WriteByte('/') 129 | case 'b': 130 | result.WriteByte('\b') 131 | case 'f': 132 | result.WriteByte('\f') 133 | case 'n': 134 | result.WriteByte('\n') 135 | case 'r': 136 | result.WriteByte('\r') 137 | case 't': 138 | result.WriteByte('\t') 139 | case 'u': 140 | if i+4 < len(s) { 141 | unicode, err := unicodeHandler(s[i+1 : i+5]) 142 | if err != nil { 143 | panic(fmt.Sprintf("lexer error: invalid unicode escape sequence '%v'", s[i:i+5])) 144 | } 145 | if utf16.IsSurrogate(unicode) && i+10 < len(s) && s[i+5:i+7] == "\\u" { 146 | lowSurrogate, err := unicodeHandler(s[i+7 : i+11]) 147 | if err != nil { 148 | panic(fmt.Sprintf("lexer error: invalid unicode escape sequence '%v'", s[i+7:i+11])) 149 | } 150 | unicode = utf16.DecodeRune(unicode, lowSurrogate) 151 | i += 6 152 | } 153 | result.WriteRune(unicode) 154 | i += 4 155 | } else { 156 | panic(fmt.Sprintf("lexer error: invalid unicode escape sequence '%v'", s[i:])) 157 | } 158 | default: 159 | result.WriteByte('\\') 160 | result.WriteByte(s[i]) 161 | } 162 | escape = false 163 | } else if s[i] == '\\' { 164 | escape = true 165 | } else { 166 | result.WriteByte(s[i]) 167 | } 168 | } 169 | return result.String() 170 | } 171 | 172 | func unicodeHandler(s string) (rune, error) { 173 | n, err := strconv.ParseUint(s, 16, 16) 174 | if err != nil { 175 | return 0, err 176 | } 177 | return rune(n), nil 178 | } 179 | 180 | func skipHandler(lexer *lexer, regex *regexp.Regexp) { 181 | lexer.advanceN(regex.FindStringIndex(lexer.remainder())[1]) 182 | } 183 | -------------------------------------------------------------------------------- /src/lexer/tokens.go: -------------------------------------------------------------------------------- 1 | package lexer 2 | 3 | import "fmt" 4 | 5 | type TokenKind int 6 | 7 | const ( 8 | STRING TokenKind = iota 9 | NUMBER 10 | BOOLEAN 11 | NULL 12 | 13 | LEFT_SQ_BRACKET 14 | RIGHT_SQ_BRACKET 15 | LEFT_CURLY_BRACKET 16 | RIGHT_CURLY_BRACKET 17 | COMMA 18 | COLON 19 | DASH 20 | PLUS 21 | EXPONENT 22 | EOF 23 | ) 24 | 25 | type Token struct { 26 | Kind TokenKind 27 | Value string 28 | } 29 | 30 | func (t Token) Debug() { 31 | if t.Kind == STRING || t.Kind == NUMBER || t.Kind == BOOLEAN { 32 | fmt.Printf("%s(%s)\n", TokenKindString(t.Kind), t.Value) 33 | } else { 34 | fmt.Printf("%s()\n", TokenKindString(t.Kind)) 35 | } 36 | } 37 | 38 | func NewToken(k TokenKind, v string) Token { 39 | return Token{k, v} 40 | } 41 | 42 | func TokenKindString(kind TokenKind) string { 43 | switch kind { 44 | case STRING: 45 | return "string" 46 | case NUMBER: 47 | return "number" 48 | case BOOLEAN: 49 | return "boolean" 50 | case NULL: 51 | return "null" 52 | case LEFT_SQ_BRACKET: 53 | return "left square bracket" 54 | case RIGHT_SQ_BRACKET: 55 | return "right square bracket" 56 | case LEFT_CURLY_BRACKET: 57 | return "left curly bracket" 58 | case RIGHT_CURLY_BRACKET: 59 | return "right curly bracket" 60 | case COMMA: 61 | return "comma" 62 | case COLON: 63 | return "colon" 64 | case DASH: 65 | return "dash" 66 | case PLUS: 67 | return "plus" 68 | case EXPONENT: 69 | return "exponent" 70 | case EOF: 71 | return "EOF" 72 | default: 73 | return fmt.Sprintf("unknown(%d)", kind) 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /src/parser/parser.go: -------------------------------------------------------------------------------- 1 | package parser 2 | 3 | import ( 4 | "fmt" 5 | "math" 6 | "strconv" 7 | 8 | "github.com/KhushPatibandha/jsonParser/src/lexer" 9 | ) 10 | 11 | type Parser struct { 12 | tokens []lexer.Token 13 | currentPosition int 14 | } 15 | 16 | func NewParser(t []lexer.Token) *Parser { 17 | return &Parser{t, 0} 18 | } 19 | 20 | func (p *Parser) Parse() (interface{}, error) { 21 | 22 | if p.isAtEnd() { 23 | return nil, fmt.Errorf("Empty JSON") 24 | } 25 | 26 | endBracket := p.tokens[len(p.tokens)-2] 27 | startBracket := p.tokens[0] 28 | if endBracket.Kind == lexer.COMMA { 29 | return nil, fmt.Errorf("Closing Parentheses Missing: Expected '}' or ']' at the end, found ','") 30 | } 31 | if endBracket.Kind != lexer.RIGHT_CURLY_BRACKET && endBracket.Kind != lexer.RIGHT_SQ_BRACKET { 32 | return nil, fmt.Errorf("Closing Parentheses Missing: Expected '}' or ']'") 33 | } 34 | if startBracket.Kind != lexer.LEFT_CURLY_BRACKET && startBracket.Kind != lexer.LEFT_SQ_BRACKET { 35 | return nil, fmt.Errorf("Opening Parentheses Missing: Expected '{' or '['") 36 | } 37 | 38 | return p.parseValue() 39 | } 40 | 41 | func (p *Parser) parseValue() (interface{}, error) { 42 | switch p.peek().Kind { 43 | case lexer.LEFT_CURLY_BRACKET: 44 | return p.parseObject() 45 | case lexer.LEFT_SQ_BRACKET: 46 | return p.parseArray() 47 | case lexer.STRING: 48 | return p.advance().Value, nil 49 | case lexer.NUMBER: 50 | return p.parseNumber() 51 | case lexer.BOOLEAN: 52 | return p.advance().Value, nil 53 | case lexer.NULL: 54 | p.advance() 55 | return nil, nil 56 | case lexer.DASH: 57 | return p.parseNumber() 58 | default: 59 | return nil, fmt.Errorf("unexpected token: %v", p.peek()) 60 | } 61 | } 62 | 63 | func (p *Parser) parseString() (string, error) { 64 | if p.peek().Kind != lexer.STRING { 65 | return "", fmt.Errorf("expected string, found %v", p.peek()) 66 | } 67 | return p.advance().Value, nil 68 | } 69 | 70 | func (p *Parser) parseNumber() (string, error) { 71 | isNegative := false 72 | if p.peek().Kind == lexer.DASH { 73 | isNegative = true 74 | p.advance() 75 | } 76 | 77 | if p.peek().Kind != lexer.NUMBER { 78 | return "", fmt.Errorf("expected number after '-', found %v", p.peek()) 79 | } 80 | number := p.advance().Value 81 | 82 | if p.peek().Kind == lexer.EXPONENT { 83 | p.advance() 84 | expNegative := false 85 | if p.peek().Kind == lexer.DASH { 86 | expNegative = true 87 | p.advance() 88 | } else if p.peek().Kind == lexer.PLUS { 89 | p.advance() 90 | } 91 | if p.peek().Kind != lexer.NUMBER { 92 | return "", fmt.Errorf("expected number after exponent, found %v", p.peek()) 93 | } 94 | expNumber, err := strconv.Atoi(p.advance().Value) 95 | if err != nil { 96 | return "", err 97 | } 98 | if expNegative { 99 | expNumber = -expNumber 100 | } 101 | 102 | baseNumber, err := strconv.ParseFloat(number, 64) 103 | if err != nil { 104 | return "", err 105 | } 106 | 107 | result := baseNumber * math.Pow10(expNumber) 108 | number = strconv.FormatFloat(result, 'f', -1, 64) 109 | } 110 | if isNegative { 111 | number = "-" + number 112 | } 113 | return number, nil 114 | } 115 | 116 | func (p *Parser) parseObject() (map[string]interface{}, error) { 117 | p.advance() 118 | mapObject := make(map[string]interface{}) 119 | 120 | for !p.isAtEnd() && p.peek().Kind != lexer.RIGHT_CURLY_BRACKET { 121 | stringKey, err := p.parseString() 122 | if err != nil { 123 | return nil, err 124 | } 125 | 126 | if !p.match(lexer.COLON) { 127 | return nil, fmt.Errorf("expected ':', found %v", p.peek()) 128 | } 129 | 130 | value, err := p.parseValue() 131 | if err != nil { 132 | return nil, err 133 | } 134 | mapObject[stringKey] = value 135 | if !p.match(lexer.COMMA) { 136 | break 137 | } 138 | 139 | if p.peek().Kind == lexer.RIGHT_CURLY_BRACKET { 140 | return nil, fmt.Errorf("json error:: trailing comma. Expected key-value pair after ',' found '}'") 141 | } 142 | } 143 | 144 | if !p.match(lexer.RIGHT_CURLY_BRACKET) { 145 | return nil, fmt.Errorf("expected '}' at the end of the object, found %v", p.peek()) 146 | } 147 | return mapObject, nil 148 | } 149 | 150 | func (p *Parser) parseArray() ([]interface{}, error) { 151 | p.advance() 152 | arraySlice := make([]interface{}, 0) 153 | 154 | for !p.isAtEnd() && p.peek().Kind != lexer.RIGHT_SQ_BRACKET { 155 | value, err := p.parseValue() 156 | if err != nil { 157 | return nil, err 158 | } 159 | 160 | arraySlice = append(arraySlice, value) 161 | if !p.match(lexer.COMMA) { 162 | break 163 | } 164 | 165 | if p.peek().Kind == lexer.RIGHT_SQ_BRACKET { 166 | return nil, fmt.Errorf("json error:: trailing comma. Expected value after ',' found ']'") 167 | } 168 | } 169 | if !p.match(lexer.RIGHT_SQ_BRACKET) { 170 | return nil, fmt.Errorf("expected ']' at the end of the array, found %v", p.peek()) 171 | } 172 | return arraySlice, nil 173 | } 174 | 175 | func (p *Parser) match(kind lexer.TokenKind) bool { 176 | if p.isAtEnd() || p.peek().Kind != kind { 177 | return false 178 | } 179 | p.advance() 180 | return true 181 | } 182 | 183 | func (p *Parser) isAtEnd() bool { 184 | return p.currentPosition >= len(p.tokens) 185 | } 186 | 187 | func (p *Parser) peek() lexer.Token { 188 | if p.isAtEnd() { 189 | return lexer.Token{Kind: lexer.EOF} 190 | } 191 | return p.tokens[p.currentPosition] 192 | } 193 | 194 | func (p *Parser) advance() lexer.Token { 195 | if !p.isAtEnd() { 196 | p.currentPosition++ 197 | } 198 | return p.tokens[p.currentPosition-1] 199 | } 200 | -------------------------------------------------------------------------------- /testJsonBlob/test1.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "_id": "6694a4c3b4ba00fd897e8219", 4 | "index": 0, 5 | "guid": "8271384e-a607-4528-9c36-54eb179602ba", 6 | "isActive": true, 7 | "balance": "$2,932.83", 8 | "picture": "http://placehold.it/32x32", 9 | "age": 20, 10 | "eyeColor": "brown", 11 | "name": "Madge Curry", 12 | "gender": "female", 13 | "company": "ZAYA", 14 | "email": "madgecurry@zaya.com", 15 | "phone": "+1 (825) 401-3372", 16 | "address": "639 Schenck Place, Barronett, Massachusetts, 235", 17 | "about": "Voluptate dolore consectetur officia fugiat consequat incididunt deserunt non culpa do do eu quis. Commodo reprehenderit aliqua irure sint in labore. Fugiat reprehenderit duis ad anim tempor aute do proident labore enim ipsum velit. Amet adipisicing velit laborum esse eiusmod tempor cillum occaecat sit mollit ut.\r\n", 18 | "registered": "2017-01-10T01:22:42 -06:-30", 19 | "latitude": -82.87119, 20 | "longitude": 28.619378, 21 | "tags": [ 22 | "eiusmod", 23 | "ex", 24 | "laborum", 25 | "nisi", 26 | "incididunt", 27 | "veniam", 28 | "culpa" 29 | ], 30 | "friends": [ 31 | { 32 | "id": 0, 33 | "name": "Gonzalez Juarez" 34 | }, 35 | { 36 | "id": 1, 37 | "name": "Angelica Herman" 38 | }, 39 | { 40 | "id": 2, 41 | "name": "Carmella Gordon" 42 | } 43 | ], 44 | "greeting": "Hello, Madge Curry! You have 2 unread messages.", 45 | "favoriteFruit": "banana" 46 | }, 47 | { 48 | "_id": "6694a4c340fb0821800574e2", 49 | "index": 1, 50 | "guid": "5c3e2b19-1c7b-4a47-909c-57dcf6c839ee", 51 | "isActive": false, 52 | "balance": "$3,579.63", 53 | "picture": "http://placehold.it/32x32", 54 | "age": 33, 55 | "eyeColor": "brown", 56 | "name": "Rios Wagner", 57 | "gender": "male", 58 | "company": "OLYMPIX", 59 | "email": "rioswagner@olympix.com", 60 | "phone": "+1 (846) 500-2841", 61 | "address": "413 Hillel Place, Silkworth, New Jersey, 911", 62 | "about": "Id in laborum minim occaecat mollit tempor nisi. Tempor cupidatat enim occaecat et reprehenderit labore ex aute quis id ea. Incididunt culpa excepteur consequat eu elit excepteur aute quis.\r\n", 63 | "registered": "2021-04-19T06:15:58 -06:-30", 64 | "latitude": -20.304022, 65 | "longitude": -70.678027, 66 | "tags": [ 67 | "laboris", 68 | "nostrud", 69 | "quis", 70 | "officia", 71 | "qui", 72 | "eu", 73 | "pariatur" 74 | ], 75 | "friends": [ 76 | { 77 | "id": 0, 78 | "name": "Claudine Cox" 79 | }, 80 | { 81 | "id": 1, 82 | "name": "Karina Campbell" 83 | }, 84 | { 85 | "id": 2, 86 | "name": "Coleen Dale" 87 | } 88 | ], 89 | "greeting": "Hello, Rios Wagner! You have 1 unread messages.", 90 | "favoriteFruit": "apple" 91 | }, 92 | { 93 | "_id": "6694a4c3fd24994181154c30", 94 | "index": 2, 95 | "guid": "cef585a0-44b5-42c1-9f74-c2fbc20eb2d7", 96 | "isActive": false, 97 | "balance": "$3,043.83", 98 | "picture": "http://placehold.it/32x32", 99 | "age": 26, 100 | "eyeColor": "blue", 101 | "name": "Lucas Lowery", 102 | "gender": "male", 103 | "company": "GINKOGENE", 104 | "email": "lucaslowery@ginkogene.com", 105 | "phone": "+1 (847) 413-3842", 106 | "address": "357 Whitty Lane, Helen, New Hampshire, 2385", 107 | "about": "Velit veniam adipisicing ea tempor excepteur fugiat. Adipisicing ullamco velit dolor magna ea ea dolor pariatur esse. Commodo officia excepteur eu culpa dolore consequat id amet nisi nulla nostrud nisi est deserunt. Commodo sunt deserunt duis veniam Lorem amet et excepteur tempor dolor. Mollit aliquip exercitation anim et aliquip culpa eiusmod. Consequat pariatur eu ex dolor anim deserunt laboris commodo veniam ex irure consequat est veniam. Exercitation nisi pariatur proident dolor.\r\n", 108 | "registered": "2016-04-30T11:37:39 -06:-30", 109 | "latitude": -41.427594, 110 | "longitude": -32.827274, 111 | "tags": [ 112 | "irure", 113 | "excepteur", 114 | "dolore", 115 | "minim", 116 | "commodo", 117 | "ea", 118 | "irure" 119 | ], 120 | "friends": [ 121 | { 122 | "id": 0, 123 | "name": "Hester Jacobson" 124 | }, 125 | { 126 | "id": 1, 127 | "name": "Rosanna Acosta" 128 | }, 129 | { 130 | "id": 2, 131 | "name": "Conley Washington" 132 | } 133 | ], 134 | "greeting": "Hello, Lucas Lowery! You have 7 unread messages.", 135 | "favoriteFruit": "banana" 136 | }, 137 | { 138 | "_id": "6694a4c3022d102593100ae3", 139 | "index": 3, 140 | "guid": "f69e40e0-ec5d-4934-a2e6-62d3debf1336", 141 | "isActive": false, 142 | "balance": "$2,796.32", 143 | "picture": "http://placehold.it/32x32", 144 | "age": 24, 145 | "eyeColor": "blue", 146 | "name": "Bird Barber", 147 | "gender": "male", 148 | "company": "PROTODYNE", 149 | "email": "birdbarber@protodyne.com", 150 | "phone": "+1 (869) 505-3017", 151 | "address": "844 Greene Avenue, Reinerton, Alaska, 8772", 152 | "about": "Nulla consectetur Lorem incididunt nisi amet non ea sit eiusmod deserunt labore ad. Anim incididunt sint do veniam nulla dolor ad nisi sunt mollit nulla qui. Aliquip nostrud ullamco consequat exercitation culpa aliquip exercitation. Incididunt esse aute fugiat aute adipisicing dolore nostrud sunt ipsum quis excepteur sunt veniam. Nostrud officia dolor magna ex irure. Ad laboris velit veniam culpa et laborum amet officia consectetur aliquip.\r\n", 153 | "registered": "2016-09-25T01:13:46 -06:-30", 154 | "latitude": 17.365562, 155 | "longitude": 90.032835, 156 | "tags": ["nostrud", "mollit", "ea", "sint", "quis", "elit", "mollit"], 157 | "friends": [ 158 | { 159 | "id": 0, 160 | "name": "Rich Freeman" 161 | }, 162 | { 163 | "id": 1, 164 | "name": "Hillary Ruiz" 165 | }, 166 | { 167 | "id": 2, 168 | "name": "Chris Mcfarland" 169 | } 170 | ], 171 | "greeting": "Hello, Bird Barber! You have 10 unread messages.", 172 | "favoriteFruit": "strawberry" 173 | }, 174 | { 175 | "_id": "6694a4c32a7bf899371d102a", 176 | "index": 4, 177 | "guid": "7b44b130-f3fc-4d58-b732-07d588d297a4", 178 | "isActive": false, 179 | "balance": "$2,476.51", 180 | "picture": "http://placehold.it/32x32", 181 | "age": 40, 182 | "eyeColor": "blue", 183 | "name": "Alana Charles", 184 | "gender": "female", 185 | "company": "CALCU", 186 | "email": "alanacharles@calcu.com", 187 | "phone": "+1 (918) 512-2995", 188 | "address": "210 Clarkson Avenue, Marne, American Samoa, 1257", 189 | "about": "In reprehenderit deserunt et cupidatat. Ex ullamco laborum dolor magna dolore qui eu. Velit sit labore sint laborum sunt eu veniam deserunt et. Ipsum ea reprehenderit consequat cupidatat excepteur velit occaecat elit et est aute sunt fugiat. Esse in laborum consectetur elit.\r\n", 190 | "registered": "2023-09-29T02:00:49 -06:-30", 191 | "latitude": -80.14583, 192 | "longitude": -65.3515, 193 | "tags": [ 194 | "commodo", 195 | "commodo", 196 | "officia", 197 | "dolore", 198 | "fugiat", 199 | "anim", 200 | "ullamco" 201 | ], 202 | "friends": [ 203 | { 204 | "id": 0, 205 | "name": "Alexander Colon" 206 | }, 207 | { 208 | "id": 1, 209 | "name": "Sharon Sparks" 210 | }, 211 | { 212 | "id": 2, 213 | "name": "Karen Holder" 214 | } 215 | ], 216 | "greeting": "Hello, Alana Charles! You have 6 unread messages.", 217 | "favoriteFruit": "apple" 218 | }, 219 | { 220 | "_id": "6694a4c3220afb68eba006ef", 221 | "index": 5, 222 | "guid": "13543bd4-137f-4183-84bd-14b6dec5c118", 223 | "isActive": false, 224 | "balance": "$3,315.13", 225 | "picture": "http://placehold.it/32x32", 226 | "age": 37, 227 | "eyeColor": "green", 228 | "name": "Giles Acevedo", 229 | "gender": "male", 230 | "company": "INSURETY", 231 | "email": "gilesacevedo@insurety.com", 232 | "phone": "+1 (977) 504-3779", 233 | "address": "261 Lake Place, Gardners, Hawaii, 4221", 234 | "about": "Labore qui sit magna dolore adipisicing labore in excepteur. Aute sit tempor deserunt deserunt cupidatat labore duis deserunt incididunt. Excepteur est excepteur incididunt sit do enim deserunt nisi sunt duis Lorem ut eiusmod dolore. Et adipisicing eu quis deserunt elit laboris do amet. Amet occaecat proident nulla irure velit sunt sunt nostrud ut ea pariatur officia velit. Irure adipisicing incididunt nisi laboris irure sunt non eu ad irure non voluptate sunt sunt. Lorem reprehenderit dolor culpa deserunt anim velit aliquip id.\r\n", 235 | "registered": "2017-06-13T11:17:37 -06:-30", 236 | "latitude": -46.28643, 237 | "longitude": 155.729078, 238 | "tags": [ 239 | "laboris", 240 | "aute", 241 | "commodo", 242 | "excepteur", 243 | "id", 244 | "occaecat", 245 | "labore" 246 | ], 247 | "friends": [ 248 | { 249 | "id": 0, 250 | "name": "Tyler Hampton" 251 | }, 252 | { 253 | "id": 1, 254 | "name": "Lou Hogan" 255 | }, 256 | { 257 | "id": 2, 258 | "name": "Hogan Mathews" 259 | } 260 | ], 261 | "greeting": "Hello, Giles Acevedo! You have 9 unread messages.", 262 | "favoriteFruit": "banana" 263 | }, 264 | { 265 | "_id": "6694a4c398747b3c597ce996", 266 | "index": 6, 267 | "guid": "ddba893e-4e52-4af3-9fcc-4e64ad6113a5", 268 | "isActive": true, 269 | "balance": "$3,323.46", 270 | "picture": "http://placehold.it/32x32", 271 | "age": 40, 272 | "eyeColor": "blue", 273 | "name": "Noel Hicks", 274 | "gender": "male", 275 | "company": "SUPREMIA", 276 | "email": "noelhicks@supremia.com", 277 | "phone": "+1 (811) 450-3290", 278 | "address": "546 Cyrus Avenue, Katonah, Georgia, 9355", 279 | "about": "Labore officia non non quis ullamco. Qui laboris officia dolore ipsum veniam aliquip ea quis in magna elit sint do in. Nulla dolore dolor laboris do sunt cillum minim aliquip elit deserunt.\r\n", 280 | "registered": "2022-08-08T04:17:32 -06:-30", 281 | "latitude": 4.419238, 282 | "longitude": -164.977899, 283 | "tags": [ 284 | "non", 285 | "laboris", 286 | "veniam", 287 | "qui", 288 | "incididunt", 289 | "cillum", 290 | "et" 291 | ], 292 | "friends": [ 293 | { 294 | "id": 0, 295 | "name": "Pena Hodge" 296 | }, 297 | { 298 | "id": 1, 299 | "name": "Gomez Fowler" 300 | }, 301 | { 302 | "id": 2, 303 | "name": "Susanne Delaney" 304 | } 305 | ], 306 | "greeting": "Hello, Noel Hicks! You have 10 unread messages.", 307 | "favoriteFruit": "banana" 308 | } 309 | ] 310 | -------------------------------------------------------------------------------- /testJsonBlob/test2.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "_id": "6694a516eb59ad1c87dc65f6", 4 | "index": 0, 5 | "guid": "0d0ecab0-fe94-4cf5-a44e-cec8c6ea9cf6", 6 | "isActive": false, 7 | "balance": "$1,695.80", 8 | "picture": "http://placehold.it/32x32", 9 | "age": 21, 10 | "eyeColor": "green", 11 | "name": "Vinson Shannon", 12 | "gender": "male", 13 | "company": "SENTIA", 14 | "email": "vinsonshannon@sentia.com", 15 | "phone": "+1 (862) 573-3296", 16 | "address": "264 Bowne Street, Carlos, Illinois, 9058", 17 | "about": "Et sint nisi nostrud fugiat fugiat occaecat. Id deserunt exercitation sit tempor commodo reprehenderit consequat labore ipsum id cupidatat ipsum fugiat. Ullamco ullamco Lorem consequat consectetur exercitation culpa dolor aute nisi.\r\n", 18 | "registered": "2014-09-17T02:55:32 -06:-30", 19 | "latitude": -36.768346, 20 | "longitude": 22.565608, 21 | "tags": [ 22 | "non", 23 | "amet", 24 | "cillum", 25 | "qui", 26 | "officia", 27 | "cillum", 28 | "reprehenderit" 29 | ], 30 | "friends": [ 31 | { 32 | "id": 0, 33 | "name": "Fletcher Jarvis" 34 | }, 35 | { 36 | "id": 1, 37 | "name": "Rosalind Boyer" 38 | }, 39 | { 40 | "id": 2, 41 | "name": "Schmidt Franklin" 42 | } 43 | ], 44 | "greeting": "Hello, Vinson Shannon! You have 4 unread messages.", 45 | "favoriteFruit": "apple" 46 | }, 47 | { 48 | "_id": "6694a516ee763d1a03ac8b65", 49 | "index": 1, 50 | "guid": "d3ac6e6f-0ea5-4a97-8284-9edd5d4030da", 51 | "isActive": true, 52 | "balance": "$1,261.01", 53 | "picture": "http://placehold.it/32x32", 54 | "age": 26, 55 | "eyeColor": "blue", 56 | "name": "Doyle Osborne", 57 | "gender": "male", 58 | "company": "ZIZZLE", 59 | "email": "doyleosborne@zizzle.com", 60 | "phone": "+1 (948) 469-2846", 61 | "address": "956 Ferry Place, Bloomington, Virgin Islands, 4409", 62 | "about": "Consectetur consectetur dolore veniam enim veniam exercitation sunt ad sit labore eiusmod qui reprehenderit Lorem. Reprehenderit dolore quis reprehenderit duis amet officia magna anim. Ea eiusmod nisi consectetur magna incididunt laborum nisi Lorem pariatur voluptate Lorem reprehenderit enim voluptate. Commodo sunt enim excepteur ullamco fugiat ad labore mollit voluptate cillum eu esse. Tempor est aliqua amet quis voluptate deserunt anim culpa ad ea minim duis tempor sit.\r\n", 63 | "registered": "2015-12-20T06:35:37 -06:-30", 64 | "latitude": 63.359873, 65 | "longitude": 95.304775, 66 | "tags": [ 67 | "irure", 68 | "velit", 69 | "minim", 70 | "do", 71 | "exercitation", 72 | "aute", 73 | "elit" 74 | ], 75 | "friends": [ 76 | { 77 | "id": 0, 78 | "name": "Pollard Dejesus" 79 | }, 80 | { 81 | "id": 1, 82 | "name": "Lola Gallagher" 83 | }, 84 | { 85 | "id": 2, 86 | "name": "Leanne Kane" 87 | } 88 | ], 89 | "greeting": "Hello, Doyle Osborne! You have 5 unread messages.", 90 | "favoriteFruit": "strawberry" 91 | }, 92 | { 93 | "_id": "6694a516a5480897889dbada", 94 | "index": 2, 95 | "guid": "9ff9ff24-e975-4c98-bc13-43cdba0a4fb2", 96 | "isActive": false, 97 | "balance": "$2,796.78", 98 | "picture": "http://placehold.it/32x32", 99 | "age": 24, 100 | "eyeColor": "brown", 101 | "name": "Lynn Malone", 102 | "gender": "male", 103 | "company": "GEEKFARM", 104 | "email": "lynnmalone@geekfarm.com", 105 | "phone": "+1 (819) 444-3552", 106 | "address": "195 Stone Avenue, Idamay, Texas, 8365", 107 | "about": "Fugiat consectetur veniam qui dolore aliqua adipisicing. Dolor eiusmod et sit quis elit irure consequat dolore dolor. Quis in occaecat ut sint. Cillum ea consequat culpa magna veniam ullamco officia laboris amet consequat duis.\r\n", 108 | "registered": "2018-06-28T04:37:16 -06:-30", 109 | "latitude": -12.635088, 110 | "longitude": 105.878411, 111 | "tags": ["deserunt", "non", "magna", "duis", "et", "elit", "do"], 112 | "friends": [ 113 | { 114 | "id": 0, 115 | "name": "Kari Donovan" 116 | }, 117 | { 118 | "id": 1, 119 | "name": "Patrick Bray" 120 | }, 121 | { 122 | "id": 2, 123 | "name": "Felicia Barrett" 124 | } 125 | ], 126 | "greeting": "Hello, Lynn Malone! You have 1 unread messages.", 127 | "favoriteFruit": "apple" 128 | }, 129 | { 130 | "_id": "6694a516559f9f9a66274e94", 131 | "index": 3, 132 | "guid": "1c1b92f1-a3e8-4f69-a7d3-fd9ee2c7ffae", 133 | "isActive": true, 134 | "balance": "$2,179.87", 135 | "picture": "http://placehold.it/32x32", 136 | "age": 32, 137 | "eyeColor": "blue", 138 | "name": "Rose Puckett", 139 | "gender": "male", 140 | "company": "COMTRAIL", 141 | "email": "rosepuckett@comtrail.com", 142 | "phone": "+1 (942) 561-3584", 143 | "address": "402 Story Court, Ellerslie, Idaho, 6516", 144 | "about": "Lorem nisi magna voluptate incididunt ullamco ut do proident sit qui labore fugiat qui est. Elit sit veniam magna occaecat veniam culpa fugiat adipisicing non proident nostrud ex nostrud. Minim consectetur laborum ad adipisicing exercitation adipisicing. Consectetur ad do qui exercitation ut do consequat nostrud. Cupidatat ex voluptate commodo aliqua. Eiusmod est id anim qui. Labore do consectetur ullamco voluptate sunt ea.\r\n", 145 | "registered": "2020-10-02T02:20:36 -06:-30", 146 | "latitude": -49.837766, 147 | "longitude": 151.707436, 148 | "tags": ["anim", "officia", "id", "do", "duis", "commodo", "laboris"], 149 | "friends": [ 150 | { 151 | "id": 0, 152 | "name": "Ora Nunez" 153 | }, 154 | { 155 | "id": 1, 156 | "name": "Reeves Stuart" 157 | }, 158 | { 159 | "id": 2, 160 | "name": "Dena Joyce" 161 | } 162 | ], 163 | "greeting": "Hello, Rose Puckett! You have 6 unread messages.", 164 | "favoriteFruit": "strawberry" 165 | }, 166 | { 167 | "_id": "6694a5165d3fa2d3e4e07b87", 168 | "index": 4, 169 | "guid": "6dd16470-225f-41ab-a9aa-d8d39d3b0a85", 170 | "isActive": true, 171 | "balance": "$1,912.30", 172 | "picture": "http://placehold.it/32x32", 173 | "age": 33, 174 | "eyeColor": "brown", 175 | "name": "Reese Cruz", 176 | "gender": "male", 177 | "company": "ZORK", 178 | "email": "reesecruz@zork.com", 179 | "phone": "+1 (841) 584-3963", 180 | "address": "596 Ocean Avenue, Kirk, Utah, 8209", 181 | "about": "Do tempor dolore officia ad reprehenderit proident magna cupidatat cupidatat tempor cillum. Proident aliqua consequat minim deserunt exercitation tempor duis. Adipisicing nulla reprehenderit minim occaecat dolore amet anim nulla ea magna ut et. Sunt proident pariatur et consequat fugiat laborum reprehenderit ut commodo consectetur.\r\n", 182 | "registered": "2016-04-14T02:15:30 -06:-30", 183 | "latitude": 18.34115, 184 | "longitude": 55.529238, 185 | "tags": ["elit", "officia", "do", "eu", "culpa", "duis", "duis"], 186 | "friends": [ 187 | { 188 | "id": 0, 189 | "name": "Peterson Guerrero" 190 | }, 191 | { 192 | "id": 1, 193 | "name": "Mayra Valdez" 194 | }, 195 | { 196 | "id": 2, 197 | "name": "Ruthie Gilliam" 198 | } 199 | ], 200 | "greeting": "Hello, Reese Cruz! You have 5 unread messages.", 201 | "favoriteFruit": "apple" 202 | }, 203 | { 204 | "_id": "6694a5160aef0c85c7d4e3d4", 205 | "index": 5, 206 | "guid": "505fb324-8ae6-4a18-8bdc-d80b3b6149a2", 207 | "isActive": true, 208 | "balance": "$2,481.42", 209 | "picture": "http://placehold.it/32x32", 210 | "age": 23, 211 | "eyeColor": "green", 212 | "name": "Lara Schultz", 213 | "gender": "female", 214 | "company": "TROLLERY", 215 | "email": "laraschultz@trollery.com", 216 | "phone": "+1 (956) 562-3666", 217 | "address": "141 Meadow Street, Lopezo, Puerto Rico, 4386", 218 | "about": "Labore nulla est eiusmod velit ex amet incididunt. Fugiat elit dolor aute mollit velit. Amet irure magna quis amet magna occaecat dolor laborum do nisi adipisicing ipsum est. Aliqua incididunt pariatur veniam consectetur ea magna nulla consectetur deserunt. Duis anim magna aliqua deserunt. Reprehenderit quis dolore ad minim consectetur eu.\r\n", 219 | "registered": "2017-02-25T08:10:08 -06:-30", 220 | "latitude": -47.299897, 221 | "longitude": 173.236437, 222 | "tags": [ 223 | "tempor", 224 | "anim", 225 | "tempor", 226 | "magna", 227 | "cillum", 228 | "laborum", 229 | "adipisicing" 230 | ], 231 | "friends": [ 232 | { 233 | "id": 0, 234 | "name": "Allyson Tyson" 235 | }, 236 | { 237 | "id": 1, 238 | "name": "Hansen Beck" 239 | }, 240 | { 241 | "id": 2, 242 | "name": "Bridget Goff" 243 | } 244 | ], 245 | "greeting": "Hello, Lara Schultz! You have 10 unread messages.", 246 | "favoriteFruit": "strawberry" 247 | }, 248 | { 249 | "_id": "6694a5164401c4f48388a834", 250 | "index": 6, 251 | "guid": "06847d96-c499-4bdb-8b46-e05c6f6556ae", 252 | "isActive": true, 253 | "balance": "$2,022.11", 254 | "picture": "http://placehold.it/32x32", 255 | "age": 28, 256 | "eyeColor": "brown", 257 | "name": "Kirsten Wright", 258 | "gender": "female", 259 | "company": "JIMBIES", 260 | "email": "kirstenwright@jimbies.com", 261 | "phone": "+1 (884) 593-3811", 262 | "address": "936 Moore Place, Breinigsville, Nebraska, 9236", 263 | "about": "Minim esse anim aliquip culpa enim culpa. Irure nulla officia labore elit elit ut id incididunt. Excepteur ullamco consectetur labore ipsum velit velit esse dolore sit aute eu qui. Excepteur nostrud reprehenderit aute sunt in esse ullamco quis proident proident irure cillum deserunt. Et qui ipsum sit deserunt elit sunt cillum.\r\n", 264 | "registered": "2020-04-07T05:42:07 -06:-30", 265 | "latitude": 54.151557, 266 | "longitude": 10.679046, 267 | "tags": [ 268 | "qui", 269 | "labore", 270 | "adipisicing", 271 | "veniam", 272 | "veniam", 273 | "dolore", 274 | "laborum" 275 | ], 276 | "friends": [ 277 | { 278 | "id": 0, 279 | "name": "Diaz Sweet" 280 | }, 281 | { 282 | "id": 1, 283 | "name": "Young Hernandez" 284 | }, 285 | { 286 | "id": 2, 287 | "name": "Claudia Rios" 288 | } 289 | ], 290 | "greeting": "Hello, Kirsten Wright! You have 10 unread messages.", 291 | "favoriteFruit": "apple" 292 | } 293 | ] 294 | -------------------------------------------------------------------------------- /testJsonBlob/test3.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "_id": "6694a524a0cce3fdc3f4817a", 4 | "index": 0, 5 | "guid": "7c2c7c46-16c3-4a35-acb8-04da1251db8e", 6 | "isActive": false, 7 | "balance": "$3,721.49", 8 | "picture": "http://placehold.it/32x32", 9 | "age": 22, 10 | "eyeColor": "blue", 11 | "name": "Hillary Hancock", 12 | "gender": "female", 13 | "company": "MEDESIGN", 14 | "email": "hillaryhancock@medesign.com", 15 | "phone": "+1 (930) 454-2590", 16 | "address": "419 Madison Place, Leland, Virgin Islands, 9958", 17 | "about": "Anim proident labore do proident. Do cillum irure eu duis incididunt ex do irure Lorem. Elit ad pariatur ipsum proident tempor nostrud do dolore quis nulla consectetur. Duis deserunt culpa irure consectetur nisi. Fugiat eu ad exercitation minim cillum amet officia elit commodo do ipsum aliquip.\r\n", 18 | "registered": "2017-02-03T03:33:01 -06:-30", 19 | "latitude": 57.02766, 20 | "longitude": -148.624226, 21 | "tags": [ 22 | "laboris", 23 | "officia", 24 | "proident", 25 | "consectetur", 26 | "occaecat", 27 | "deserunt", 28 | "commodo" 29 | ], 30 | "friends": [ 31 | { 32 | "id": 0, 33 | "name": "Church Montoya" 34 | }, 35 | { 36 | "id": 1, 37 | "name": "Moreno Mercer" 38 | }, 39 | { 40 | "id": 2, 41 | "name": "Alexander Horne" 42 | } 43 | ], 44 | "greeting": "Hello, Hillary Hancock! You have 10 unread messages.", 45 | "favoriteFruit": "strawberry" 46 | }, 47 | { 48 | "_id": "6694a524324b388f6b0af5f9", 49 | "index": 1, 50 | "guid": "ed1fac43-49ee-47dd-bc8c-5b610f0d0ef6", 51 | "isActive": false, 52 | "balance": "$3,793.72", 53 | "picture": "http://placehold.it/32x32", 54 | "age": 29, 55 | "eyeColor": "blue", 56 | "name": "Juarez Beasley", 57 | "gender": "male", 58 | "company": "ENQUILITY", 59 | "email": "juarezbeasley@enquility.com", 60 | "phone": "+1 (998) 565-2613", 61 | "address": "576 Gates Avenue, Marysville, Colorado, 4543", 62 | "about": "Laborum ullamco minim ullamco laboris anim enim adipisicing. Aute qui laborum tempor duis excepteur eiusmod officia deserunt. Ut pariatur ipsum do laboris amet irure do non consequat ut qui laborum dolor. Dolore ex minim nulla magna dolor. Sunt cupidatat fugiat minim quis et reprehenderit ad do enim commodo enim ipsum.\r\n", 63 | "registered": "2019-02-27T03:12:09 -06:-30", 64 | "latitude": -64.588092, 65 | "longitude": -43.216644, 66 | "tags": [ 67 | "ad", 68 | "aute", 69 | "minim", 70 | "exercitation", 71 | "sint", 72 | "ex", 73 | "voluptate" 74 | ], 75 | "friends": [ 76 | { 77 | "id": 0, 78 | "name": "Erin Hewitt" 79 | }, 80 | { 81 | "id": 1, 82 | "name": "Mann Casey" 83 | }, 84 | { 85 | "id": 2, 86 | "name": "Ernestine Tran" 87 | } 88 | ], 89 | "greeting": "Hello, Juarez Beasley! You have 2 unread messages.", 90 | "favoriteFruit": "strawberry" 91 | }, 92 | { 93 | "_id": "6694a524d9400d68f5056bc7", 94 | "index": 2, 95 | "guid": "890dfabf-9a29-4524-a314-05b16445c2b0", 96 | "isActive": true, 97 | "balance": "$3,263.12", 98 | "picture": "http://placehold.it/32x32", 99 | "age": 23, 100 | "eyeColor": "blue", 101 | "name": "Bailey Vega", 102 | "gender": "male", 103 | "company": "NURALI", 104 | "email": "baileyvega@nurali.com", 105 | "phone": "+1 (874) 446-2693", 106 | "address": "396 Meadow Street, Smock, Minnesota, 1239", 107 | "about": "Consequat quis occaecat sit magna aliquip eiusmod do ex cupidatat enim. Fugiat proident ad et id excepteur est labore sint aliqua incididunt ut esse magna. Minim aliquip veniam in voluptate amet. Consequat laboris velit cupidatat ea nisi voluptate fugiat tempor minim et ut cillum deserunt.\r\n", 108 | "registered": "2014-11-10T09:21:12 -06:-30", 109 | "latitude": -35.0988, 110 | "longitude": -42.735691, 111 | "tags": [ 112 | "esse", 113 | "eiusmod", 114 | "ullamco", 115 | "laborum", 116 | "id", 117 | "ex", 118 | "commodo" 119 | ], 120 | "friends": [ 121 | { 122 | "id": 0, 123 | "name": "Fern Simpson" 124 | }, 125 | { 126 | "id": 1, 127 | "name": "Yang Oneill" 128 | }, 129 | { 130 | "id": 2, 131 | "name": "Valencia Richard" 132 | } 133 | ], 134 | "greeting": "Hello, Bailey Vega! You have 6 unread messages.", 135 | "favoriteFruit": "banana" 136 | }, 137 | { 138 | "_id": "6694a524f53d870d5eb2396c", 139 | "index": 3, 140 | "guid": "c4868375-182f-46c9-ba25-fd414d66c63b", 141 | "isActive": true, 142 | "balance": "$2,023.81", 143 | "picture": "http://placehold.it/32x32", 144 | "age": 21, 145 | "eyeColor": "brown", 146 | "name": "Roberts Middleton", 147 | "gender": "male", 148 | "company": "ACIUM", 149 | "email": "robertsmiddleton@acium.com", 150 | "phone": "+1 (910) 547-2269", 151 | "address": "825 Gallatin Place, Byrnedale, Kentucky, 7929", 152 | "about": "Consectetur sint ut enim commodo aute qui qui. Pariatur consectetur elit officia minim do ea labore quis proident sunt. Qui enim quis reprehenderit deserunt. Dolore culpa labore nostrud dolore aliqua quis irure ut deserunt ea do commodo voluptate dolore. Ad ad enim exercitation eu deserunt ad enim non occaecat fugiat fugiat nostrud ipsum. Ad Lorem voluptate sint ad.\r\n", 153 | "registered": "2016-12-04T02:04:33 -06:-30", 154 | "latitude": 22.833557, 155 | "longitude": -169.907391, 156 | "tags": ["sint", "elit", "velit", "ullamco", "dolore", "ex", "quis"], 157 | "friends": [ 158 | { 159 | "id": 0, 160 | "name": "Mcneil England" 161 | }, 162 | { 163 | "id": 1, 164 | "name": "Martinez Sawyer" 165 | }, 166 | { 167 | "id": 2, 168 | "name": "Carla Walsh" 169 | } 170 | ], 171 | "greeting": "Hello, Roberts Middleton! You have 7 unread messages.", 172 | "favoriteFruit": "apple" 173 | }, 174 | { 175 | "_id": "6694a524885305fbf0c3386a", 176 | "index": 4, 177 | "guid": "418d3c28-bb76-4d35-862e-938826672b6c", 178 | "isActive": true, 179 | "balance": "$3,246.91", 180 | "picture": "http://placehold.it/32x32", 181 | "age": 24, 182 | "eyeColor": "brown", 183 | "name": "Fulton Wilkerson", 184 | "gender": "male", 185 | "company": "SLAMBDA", 186 | "email": "fultonwilkerson@slambda.com", 187 | "phone": "+1 (816) 482-2592", 188 | "address": "136 Lancaster Avenue, Keyport, Florida, 299", 189 | "about": "Fugiat et ad elit occaecat ea excepteur duis et eiusmod laborum dolore. Do duis aliquip ea amet officia aute duis. Non non sint tempor nostrud ad anim adipisicing ut ex. Veniam voluptate aliqua quis non eu minim anim adipisicing cupidatat id aliqua. Do deserunt aute voluptate consectetur velit irure minim exercitation voluptate.\r\n", 190 | "registered": "2021-11-27T01:28:16 -06:-30", 191 | "latitude": 81.215504, 192 | "longitude": 138.93357, 193 | "tags": [ 194 | "excepteur", 195 | "aliquip", 196 | "occaecat", 197 | "mollit", 198 | "reprehenderit", 199 | "dolor", 200 | "amet" 201 | ], 202 | "friends": [ 203 | { 204 | "id": 0, 205 | "name": "Buchanan Weaver" 206 | }, 207 | { 208 | "id": 1, 209 | "name": "Kristen Carlson" 210 | }, 211 | { 212 | "id": 2, 213 | "name": "Dana Martin" 214 | } 215 | ], 216 | "greeting": "Hello, Fulton Wilkerson! You have 7 unread messages.", 217 | "favoriteFruit": "banana" 218 | }, 219 | { 220 | "_id": "6694a524a84e61e5f02cb540", 221 | "index": 5, 222 | "guid": "26266887-8739-406c-87aa-62932e927c71", 223 | "isActive": false, 224 | "balance": "$3,611.85", 225 | "picture": "http://placehold.it/32x32", 226 | "age": 28, 227 | "eyeColor": "blue", 228 | "name": "Terrell Stafford", 229 | "gender": "male", 230 | "company": "CALCU", 231 | "email": "terrellstafford@calcu.com", 232 | "phone": "+1 (817) 443-2192", 233 | "address": "485 Saratoga Avenue, Chilton, Hawaii, 7960", 234 | "about": "Voluptate et proident adipisicing mollit irure pariatur voluptate Lorem consequat nisi. Esse fugiat dolore mollit cupidatat. Sit deserunt ipsum sunt consectetur. Sint ullamco duis ullamco consequat officia id ad. Duis consectetur voluptate incididunt aute adipisicing occaecat minim laboris velit sunt nisi. Minim reprehenderit proident sunt elit dolor laborum Lorem eiusmod non ad.\r\n", 235 | "registered": "2020-01-18T11:07:29 -06:-30", 236 | "latitude": -31.30896, 237 | "longitude": 43.451373, 238 | "tags": [ 239 | "nisi", 240 | "dolore", 241 | "fugiat", 242 | "exercitation", 243 | "enim", 244 | "commodo", 245 | "Lorem" 246 | ], 247 | "friends": [ 248 | { 249 | "id": 0, 250 | "name": "Lester Mcdowell" 251 | }, 252 | { 253 | "id": 1, 254 | "name": "Sheri Ellis" 255 | }, 256 | { 257 | "id": 2, 258 | "name": "Moran Morin" 259 | } 260 | ], 261 | "greeting": "Hello, Terrell Stafford! You have 2 unread messages.", 262 | "favoriteFruit": "apple" 263 | } 264 | ] 265 | -------------------------------------------------------------------------------- /testJsonBlob/test4.json: -------------------------------------------------------------------------------- 1 | { 2 | "min_position": 5, 3 | "has_more_items": false, 4 | "items_html": "Bus", 5 | "new_latent_count": 2, 6 | "data": { 7 | "length": 26, 8 | "text": "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." 9 | }, 10 | "numericalArray": [31, 27, 20, 28, 28], 11 | "StringArray": ["Carbon", "Nitrogen", "Oxygen", "Oxygen"], 12 | "multipleTypesArray": 5, 13 | "objArray": [ 14 | { 15 | "class": "lower", 16 | "age": 3 17 | }, 18 | { 19 | "class": "middle", 20 | "age": 8 21 | }, 22 | { 23 | "class": "upper", 24 | "age": 9 25 | }, 26 | { 27 | "class": "middle", 28 | "age": 7 29 | }, 30 | { 31 | "class": "lower", 32 | "age": 1 33 | } 34 | ] 35 | } 36 | -------------------------------------------------------------------------------- /testJsonBlob/test5.json: -------------------------------------------------------------------------------- 1 | { 2 | "person": { 3 | "name": "Alice", 4 | "attributes": [ 5 | { 6 | "height": "5ft 7in", 7 | "age": 29, 8 | "hobbies": [ 9 | "reading", 10 | "coding", 11 | { 12 | "sports": ["basketball", "tennis"] 13 | } 14 | ] 15 | }, 16 | { 17 | "occupation": "Engineer", 18 | "projects": [ 19 | { 20 | "name": "Project X", 21 | "duration": "2 years", 22 | "team": [ 23 | { 24 | "role": "Manager", 25 | "experience": ["5 years", "10 projects"] 26 | }, 27 | { 28 | "role": "Developer", 29 | "skills": [ 30 | "JavaScript", 31 | "Python", 32 | { 33 | "frameworks": ["React", "Django"] 34 | } 35 | ] 36 | } 37 | ] 38 | } 39 | ] 40 | } 41 | ] 42 | }, 43 | "company": { 44 | "departments": [ 45 | { 46 | "name": "Engineering", 47 | "employees": [ 48 | { 49 | "name": "Bob", 50 | "roles": [ 51 | "Developer", 52 | { 53 | "specialties": ["Frontend", "Backend"] 54 | } 55 | ] 56 | } 57 | ] 58 | }, 59 | { 60 | "name": "HR", 61 | "policies": [ 62 | { 63 | "policyName": "Leave Policy", 64 | "details": { 65 | "annualLeave": "20 days", 66 | "sickLeave": "10 days", 67 | "maternityLeave": { 68 | "duration": "6 months", 69 | "conditions": [ 70 | "Full pay for first 3 months", 71 | "Half pay for next 3 months" 72 | ] 73 | } 74 | } 75 | } 76 | ] 77 | } 78 | ] 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /testJsonBlob/test6.json: -------------------------------------------------------------------------------- 1 | { 2 | "megaStructure": { 3 | "level1": [ 4 | { 5 | "id": "A1", 6 | "nestedObject": { 7 | "array1": [ 8 | { 9 | "deepObject1": { 10 | "deeperArray": [ 11 | [ 12 | { "key1": "value1" }, 13 | { 14 | "key2": "value2", 15 | "subArray": [ 16 | [1, 2], 17 | [ 18 | 3, 19 | 4, 20 | [5, 6, { "nested": "here" }] 21 | ] 22 | ] 23 | } 24 | ], 25 | { 26 | "mixedContent": [ 27 | 1, 28 | "string", 29 | { 30 | "objectInArray": { 31 | "moreNesting": { 32 | "andMore": [ 33 | { 34 | "deepest": "perhaps" 35 | } 36 | ] 37 | } 38 | } 39 | }, 40 | [ 41 | { 42 | "surprise": [ 43 | "nested", 44 | "array", 45 | { 46 | "inObject": { 47 | "inArray": [ 48 | 1, 2, 3 49 | ] 50 | } 51 | } 52 | ] 53 | }, 54 | [ 55 | "multi", 56 | "dimensional", 57 | ["array"] 58 | ] 59 | ] 60 | ] 61 | } 62 | ] 63 | } 64 | }, 65 | { 66 | "deepObject2": { 67 | "arrayOfArrays": [ 68 | [1, 2, 3], 69 | [ 70 | 4, 71 | 5, 72 | 6, 73 | [ 74 | 7, 75 | 8, 76 | { 77 | "nestedAgain": { 78 | "andAgain": [ 79 | 9, 80 | 10, 81 | { "oneMore": [11, 12] } 82 | ] 83 | } 84 | } 85 | ] 86 | ] 87 | ], 88 | "objectWithArrays": { 89 | "array1": [1, 2, 3], 90 | "array2": [4, 5, 6], 91 | "nestedObjects": [ 92 | { 93 | "a": 1, 94 | "b": [ 95 | 2, 96 | 3, 97 | { 98 | "c": [ 99 | 4, 100 | 5, 101 | { 102 | "d": [ 103 | 6, 104 | 7, 105 | { "e": 8 } 106 | ] 107 | } 108 | ] 109 | } 110 | ] 111 | }, 112 | { 113 | "x": { 114 | "y": { 115 | "z": [ 116 | 9, 117 | 10, 118 | { 119 | "deepZ": { 120 | "evenDeeper": [ 121 | 11, 122 | 12, 123 | [13, 14, 15] 124 | ] 125 | } 126 | } 127 | ] 128 | } 129 | } 130 | } 131 | ] 132 | } 133 | } 134 | } 135 | ], 136 | "array2": [ 137 | [ 138 | { 139 | "nested1": { 140 | "nested2": { "nested3": [1, 2, 3] } 141 | } 142 | }, 143 | { 144 | "nested4": [ 145 | { 146 | "nested5": [ 147 | { 148 | "nested6": { 149 | "nested7": [4, 5, 6] 150 | } 151 | } 152 | ] 153 | } 154 | ] 155 | } 156 | ], 157 | { 158 | "complexNesting": { 159 | "level1": [ 160 | { 161 | "level2": { 162 | "level3": [ 163 | { 164 | "level4": [ 165 | 1, 166 | 2, 167 | { 168 | "level5": { 169 | "level6": [ 170 | 3, 171 | 4, 172 | { 173 | "level7": [ 174 | 5, 175 | 6, 7 176 | ] 177 | } 178 | ] 179 | } 180 | } 181 | ] 182 | }, 183 | { 184 | "alternateLevel4": { 185 | "deeperAlternate": { 186 | "evenDeeper": [ 187 | 8, 9, 10 188 | ] 189 | } 190 | } 191 | } 192 | ] 193 | } 194 | } 195 | ] 196 | } 197 | } 198 | ] 199 | } 200 | }, 201 | { 202 | "id": "A2", 203 | "arrayOfMixedObjects": [ 204 | { "simple": "object" }, 205 | [ 206 | 1, 207 | 2, 208 | 3, 209 | { 210 | "notSoSimple": { 211 | "deeper": [4, 5, 6, { "evenDeeper": [7, 8, 9] }] 212 | } 213 | } 214 | ], 215 | { 216 | "complexObject": { 217 | "nestedArray": [ 218 | [ 219 | { 220 | "layer1": { 221 | "layer2": { "layer3": [1, 2, 3] } 222 | } 223 | }, 224 | [ 225 | { 226 | "layer4": [ 227 | { 228 | "layer5": { 229 | "layer6": [4, 5, 6] 230 | } 231 | } 232 | ] 233 | } 234 | ] 235 | ], 236 | { 237 | "mixedLayers": [ 238 | 1, 239 | [ 240 | 2, 241 | 3, 242 | { 243 | "nested": [ 244 | 4, 245 | 5, 246 | { 247 | "moreNested": [ 248 | 6, 249 | 7, 250 | { "deepest": 8 } 251 | ] 252 | } 253 | ] 254 | } 255 | ], 256 | { 257 | "objectInArray": { 258 | "arrayInObject": [ 259 | 9, 260 | 10, 261 | { "finalLayer": [11, 12] } 262 | ] 263 | } 264 | } 265 | ] 266 | } 267 | ] 268 | } 269 | } 270 | ] 271 | } 272 | ], 273 | "level2": { 274 | "deeplyNestedStructure": { 275 | "branch1": [ 276 | { 277 | "subBranch1": [ 278 | [1, 2, 3], 279 | [ 280 | 4, 281 | 5, 282 | { 283 | "nested": [ 284 | 6, 285 | 7, 286 | { 287 | "deeper": [ 288 | 8, 289 | 9, 290 | { "evenDeeper": [10, 11, 12] } 291 | ] 292 | } 293 | ] 294 | } 295 | ] 296 | ], 297 | "subBranch2": { 298 | "nestedObject": { 299 | "arrayProperty": [ 300 | { "obj1": { "arr1": [1, 2, 3] } }, 301 | { 302 | "obj2": { 303 | "arr2": [ 304 | 4, 305 | 5, 306 | { "nested": [6, 7, 8] } 307 | ] 308 | } 309 | } 310 | ], 311 | "objectProperty": { 312 | "nestedArray": [ 313 | [ 314 | 9, 315 | 10, 316 | { 317 | "deepObj": { 318 | "deeperArray": [ 319 | 11, 320 | 12, 321 | [13, 14, 15] 322 | ] 323 | } 324 | } 325 | ], 326 | { 327 | "mixedContent": [ 328 | 16, 329 | [17, 18], 330 | { 331 | "lastObj": { 332 | "lastArray": [19, 20] 333 | } 334 | } 335 | ] 336 | } 337 | ] 338 | } 339 | } 340 | } 341 | } 342 | ], 343 | "branch2": { 344 | "arrayBranch": [ 345 | [ 346 | { "nested1": [1, 2, 3] }, 347 | { 348 | "nested2": [ 349 | 4, 350 | 5, 351 | { 352 | "nested3": [ 353 | 6, 354 | 7, 355 | { "nested4": [8, 9, 10] } 356 | ] 357 | } 358 | ] 359 | } 360 | ], 361 | { 362 | "objectInArrayInObject": { 363 | "property1": [ 364 | { 365 | "subProp1": [ 366 | 1, 367 | 2, 368 | { 369 | "deeperProp": [ 370 | 3, 371 | 4, 372 | { 373 | "evenDeeperProp": [ 374 | 5, 6, 7 375 | ] 376 | } 377 | ] 378 | } 379 | ] 380 | }, 381 | { 382 | "subProp2": { 383 | "nestedObj": { 384 | "nestedArray": [ 385 | 8, 386 | 9, 387 | [ 388 | 10, 389 | 11, 390 | { "finalNest": 12 } 391 | ] 392 | ] 393 | } 394 | } 395 | } 396 | ], 397 | "property2": { 398 | "arrayOfArrays": [ 399 | [1, 2, [3, 4, [5, 6]]], 400 | [7, [8, [9, [10, [11, 12]]]]], 401 | { 402 | "surprise": { 403 | "objectInArrayOfArrays": { 404 | "finalProperty": [ 405 | 13, 14, 15 406 | ] 407 | } 408 | } 409 | } 410 | ] 411 | } 412 | } 413 | } 414 | ] 415 | } 416 | } 417 | } 418 | } 419 | } 420 | -------------------------------------------------------------------------------- /testJsonBlob/test7.json: -------------------------------------------------------------------------------- 1 | { 2 | "ecosystemData": { 3 | "biomes": [ 4 | { 5 | "name": "Tropical Rainforest", 6 | "characteristics": { 7 | "climate": { 8 | "temperature": { 9 | "average": 25, 10 | "variations": [ 11 | { "season": "wet", "range": [23, 28] }, 12 | { "season": "dry", "range": [22, 30] } 13 | ] 14 | }, 15 | "precipitation": { 16 | "annual": 2000, 17 | "monthly": [ 18 | { "month": "January", "amount": 200 }, 19 | { "month": "February", "amount": 180 }, 20 | { "month": "March", "amount": 220 }, 21 | { 22 | "month": "April", 23 | "amount": 190, 24 | "events": [ 25 | { 26 | "type": "storm", 27 | "intensity": "high", 28 | "duration": 2 29 | } 30 | ] 31 | } 32 | ] 33 | } 34 | }, 35 | "biodiversity": { 36 | "floraSpecies": [ 37 | { 38 | "name": "Orchid", 39 | "varieties": [ 40 | { 41 | "scientificName": "Phalaenopsis", 42 | "colors": ["white", "pink", "purple"] 43 | }, 44 | { 45 | "scientificName": "Cattleya", 46 | "colors": [ 47 | "lavender", 48 | "white", 49 | "yellow", 50 | "red" 51 | ] 52 | } 53 | ], 54 | "habitat": { 55 | "canopyLayer": "epiphyte", 56 | "soilTypes": [ 57 | "humus-rich", 58 | "well-draining" 59 | ], 60 | "lightRequirements": { 61 | "intensity": "filtered", 62 | "duration": { 63 | "summer": 14, 64 | "winter": 12, 65 | "variations": [ 66 | { 67 | "condition": "cloudy", 68 | "reduction": 2 69 | }, 70 | { 71 | "condition": "dense canopy", 72 | "reduction": 3 73 | } 74 | ] 75 | } 76 | } 77 | } 78 | } 79 | ], 80 | "faunaSpecies": [ 81 | { 82 | "name": "Jaguar", 83 | "scientificName": "Panthera onca", 84 | "diet": [ 85 | { "prey": "Capybara", "preferenceRank": 1 }, 86 | { "prey": "Deer", "preferenceRank": 2 }, 87 | { 88 | "prey": "Fish", 89 | "preferenceRank": 3, 90 | "conditions": [ 91 | { 92 | "season": "dry", 93 | "availability": "high" 94 | }, 95 | { 96 | "season": "wet", 97 | "availability": "moderate" 98 | } 99 | ] 100 | } 101 | ], 102 | "behavior": { 103 | "activity": [ 104 | { 105 | "period": "nocturnal", 106 | "primaryActions": [ 107 | "hunting", 108 | "patrolling" 109 | ] 110 | }, 111 | { 112 | "period": "crepuscular", 113 | "primaryActions": [ 114 | "resting", 115 | "grooming" 116 | ] 117 | } 118 | ], 119 | "socialStructure": { 120 | "type": "solitary", 121 | "exceptions": [ 122 | { 123 | "scenario": "mating", 124 | "duration": "1-2 weeks" 125 | }, 126 | { 127 | "scenario": "mother with cubs", 128 | "duration": "up to 2 years" 129 | } 130 | ] 131 | }, 132 | "territorySize": { 133 | "average": 100, 134 | "unit": "km²", 135 | "factors": [ 136 | { 137 | "influence": "prey density", 138 | "correlation": "negative" 139 | }, 140 | { 141 | "influence": "human encroachment", 142 | "correlation": "positive", 143 | "notes": [ 144 | "Leads to smaller territories", 145 | "Increases conflict potential" 146 | ] 147 | } 148 | ] 149 | } 150 | } 151 | } 152 | ] 153 | } 154 | }, 155 | "conservation": { 156 | "threats": [ 157 | { 158 | "type": "Deforestation", 159 | "severity": "high", 160 | "causes": [ 161 | "Agriculture expansion", 162 | "Logging", 163 | "Urbanization" 164 | ], 165 | "impacts": [ 166 | { 167 | "target": "Habitat", 168 | "consequence": "Fragmentation", 169 | "secondaryEffects": [ 170 | { 171 | "issue": "Reduced biodiversity", 172 | "scale": 8 173 | }, 174 | { "issue": "Soil erosion", "scale": 7 }, 175 | { 176 | "issue": "Climate change", 177 | "scale": 9, 178 | "details": { 179 | "carbonRelease": { 180 | "amount": "high", 181 | "sources": [ 182 | "Burning", 183 | "Decomposition" 184 | ], 185 | "globalImpact": { 186 | "temperature": "+0.1°C", 187 | "timeline": "per decade", 188 | "uncertainties": [ 189 | "Feedback loops", 190 | "Tipping points" 191 | ] 192 | } 193 | } 194 | } 195 | } 196 | ] 197 | } 198 | ] 199 | } 200 | ], 201 | "initiatives": [ 202 | { 203 | "name": "Canopy Corridors", 204 | "goal": "Reconnect fragmented forest areas", 205 | "methods": [ 206 | { 207 | "technique": "Reforestation", 208 | "targetAreas": [ 209 | "Cleared lands", 210 | "Degraded pastures" 211 | ], 212 | "species": [ 213 | { 214 | "name": "Ceiba pentandra", 215 | "growthRate": "fast", 216 | "ecologicalValue": "high" 217 | }, 218 | { 219 | "name": "Swietenia macrophylla", 220 | "growthRate": "moderate", 221 | "economicValue": "high" 222 | } 223 | ], 224 | "challenges": [ 225 | { 226 | "factor": "Soil quality", 227 | "mitigation": [ 228 | "Composting", 229 | "Mycorrhizal inoculation" 230 | ] 231 | }, 232 | { 233 | "factor": "Water availability", 234 | "mitigation": [ 235 | "Drip irrigation", 236 | "Mulching" 237 | ] 238 | } 239 | ] 240 | }, 241 | { 242 | "technique": "Agroforestry", 243 | "benefits": [ 244 | { 245 | "ecological": "Increased habitat", 246 | "score": 8 247 | }, 248 | { 249 | "economic": "Sustainable income", 250 | "score": 7 251 | }, 252 | { 253 | "social": "Food security", 254 | "score": 9 255 | } 256 | ], 257 | "implementation": { 258 | "phases": [ 259 | { 260 | "stage": "Planning", 261 | "duration": "6 months", 262 | "keyActivities": [ 263 | "Stakeholder engagement", 264 | "Site assessment", 265 | "Species selection" 266 | ] 267 | }, 268 | { 269 | "stage": "Planting", 270 | "duration": "1-2 years", 271 | "keyActivities": [ 272 | "Seedling nursery establishment", 273 | "Field preparation", 274 | "Planting and initial care" 275 | ] 276 | }, 277 | { 278 | "stage": "Monitoring", 279 | "duration": "Ongoing", 280 | "keyActivities": [ 281 | "Growth assessment", 282 | "Biodiversity surveys", 283 | "Socio-economic impact evaluation" 284 | ] 285 | } 286 | ], 287 | "partners": [ 288 | { 289 | "name": "Local communities", 290 | "role": "Implementation and maintenance" 291 | }, 292 | { 293 | "name": "NGOs", 294 | "role": "Technical support and funding" 295 | }, 296 | { 297 | "name": "Government agencies", 298 | "role": "Policy support and land allocation" 299 | } 300 | ] 301 | } 302 | } 303 | ] 304 | } 305 | ] 306 | } 307 | } 308 | ] 309 | } 310 | } 311 | -------------------------------------------------------------------------------- /testJsonBlob/test8.json: -------------------------------------------------------------------------------- 1 | { 2 | "level1": { 3 | "value1": 1.23e3, 4 | "level2": { 5 | "value2": -4.56e-7, 6 | "level3": { 7 | "value3": 7.89e10, 8 | "level4": { 9 | "value4": 0.123e-2, 10 | "array": [ 11 | 1.0, 12 | -2.0e1, 13 | 3.0e2, 14 | { 15 | "nestedValue1": 4.0e3, 16 | "nestedLevel5": { 17 | "nestedValue2": -5.0e4, 18 | "nestedLevel6": { 19 | "nestedValue3": 6.0e-5, 20 | "nestedLevel7": { 21 | "nestedValue4": -7.0e6, 22 | "nestedArray": [ 23 | 8.0e7, 24 | -9.0e8, 25 | 1.0e9, 26 | { 27 | "deepValue1": 2.0e10, 28 | "deepLevel8": { 29 | "deepValue2": -3.0e-11, 30 | "deepLevel9": { 31 | "deepValue3": 4.0e12, 32 | "deepArray": [ 33 | 5.0e-13, 34 | -6.0e14, 35 | 7.0e15, 36 | { 37 | "deeperValue1": 8.0e-16, 38 | "deeperLevel10": { 39 | "deeperValue2": -9.0e17, 40 | "deeperLevel11": { 41 | "deeperValue3": 1.0e18, 42 | "deeperArray": [ 43 | 2.0e19, 44 | -3.0e20, 45 | 4.0e-21, 46 | { 47 | "deepestValue1": 5.0e22, 48 | "deepestLevel12": { 49 | "deepestValue2": -6.0e23, 50 | "deepestLevel13": { 51 | "deepestValue3": 7.0e-24, 52 | "deepestArray": [ 53 | 8.0e25, 54 | -9.0e26, 55 | 1.0e27, 56 | { 57 | "finalValue1": 2.0e28, 58 | "finalLevel14": { 59 | "finalValue2": -3.0e29, 60 | "finalArray": [ 61 | 4.0e30, 62 | -5.0e-31, 63 | 6.0e32, 64 | { 65 | "ultimateValue1": 7.0e33, 66 | "ultimateLevel15": { 67 | "ultimateValue2": -8.0e34, 68 | "ultimateArray": [ 69 | 9.0e-35, 70 | -1.0e36, 71 | 2.0e37, 72 | { 73 | "endValue1": 3.0e-38, 74 | "endArray": [ 75 | 4.0e39, 76 | -5.0e40 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 | -------------------------------------------------------------------------------- /testJsonBlob/test9.json: -------------------------------------------------------------------------------- 1 | { 2 | "escape_characters": { 3 | "double_quote": "This string has a \"quoted\" word.", 4 | "backslash": "This string has a backslash: \\", 5 | "forward_slash": "Forward slashes can be escaped: /", 6 | "newline": "This string has a newline:\nThis is on a new line.", 7 | "tab": "This string has a tab:\tThis is after a tab.", 8 | "backspace": "This string has a backspace:\bThis is after a backspace.", 9 | "mixed": "Mixed escapes: \"\\/ \n\t\b", 10 | "repeated": "Repeated escapes: \\\\ \"\" // \n\n \t\t \b\b", 11 | "edge_cases": { 12 | "escape_at_end": "This string ends with a backslash\\", 13 | "only_escape": "\\", 14 | "empty_with_escape": "" 15 | } 16 | } 17 | } 18 | --------------------------------------------------------------------------------