|
10 | 10 | * Accepts a string consisting of one or more valid JSON substrings and splits it. Any remaining string after the end of the last complete JSON substring is returned in the 'remainder' field. |
11 | 11 | * Passing in invalid JSON can result in garbage output |
12 | 12 | * |
13 | | - * @param {string} string The string to look for JSON in |
14 | | - * @returns {{ jsons: string[], remainder: '' }} |
| 13 | + * @param string The string to look for JSON in |
15 | 14 | * |
16 | 15 | * @example |
17 | | - * var splitter = require('json-string-splitter'); |
18 | | - * |
19 | | - * var pieces = splitter('{"foo":"bar"}{"more":"json"}{"partial":"json"'); |
| 16 | + * const pieces = splitter('{"foo":"bar"}{"more":"json"}{"partial":"json"') |
20 | 17 | * |
21 | 18 | * console.log(pieces.jsons[0]); // '{"foo":"bar"}' |
22 | 19 | * console.log(pieces.jsons[1]); // '{"more":"json"}' |
23 | 20 | * console.log(pieces.remainder); // '{"partial":"json"' |
24 | 21 | */ |
25 | | -export function splitter(string) { |
26 | | - var START = 0, JSON = 1, STRING = 2, ESCAPE = 3; |
| 22 | +export function splitter(string: string): { jsons: string[], remainder: string } { |
| 23 | + const START = 0, JSON = 1, STRING = 2, ESCAPE = 3 |
27 | 24 |
|
28 | | - var state = START; |
29 | | - var nesting_level = 0; |
30 | | - var json_start = null; |
31 | | - var bounds = []; |
| 25 | + let state = START |
| 26 | + let nestingLevel = 0 |
| 27 | + let jsonStart = null |
| 28 | + const bounds = [] |
32 | 29 |
|
33 | | - for(var i = 0 || 0; i < string.length; ++i) { |
34 | | - switch(state) { |
35 | | - case START: |
36 | | - switch(string[i]) { |
37 | | - case '{': |
38 | | - ++nesting_level; |
39 | | - state = JSON; |
40 | | - json_start = i; |
41 | | - break; |
| 30 | + for (let i = 0; i < string.length; ++i) { |
| 31 | + switch (state) { |
| 32 | + case START: { |
| 33 | + switch (string[i]) { |
| 34 | + case '{': { |
| 35 | + ++nestingLevel |
| 36 | + state = JSON |
| 37 | + jsonStart = i |
| 38 | + break |
| 39 | + } |
42 | 40 | } |
43 | | - break; |
44 | | - case JSON: |
45 | | - switch(string[i]) { |
46 | | - case '{': ++nesting_level; break; |
47 | | - case '}': |
48 | | - --nesting_level; |
49 | | - if(nesting_level === 0) { |
50 | | - state = START; |
51 | | - bounds.push({ start: json_start, end: i + 1 }); |
| 41 | + break |
| 42 | + } |
| 43 | + case JSON: { |
| 44 | + switch (string[i]) { |
| 45 | + case '{': { |
| 46 | + ++nestingLevel |
| 47 | + break |
| 48 | + } |
| 49 | + case '}': { |
| 50 | + --nestingLevel |
| 51 | + if (nestingLevel === 0) { |
| 52 | + state = START |
| 53 | + bounds.push({ start: jsonStart, end: i + 1 }) |
52 | 54 | } |
53 | | - break; |
54 | | - case '"': state = STRING; break; |
| 55 | + break |
| 56 | + } |
| 57 | + case '"': { |
| 58 | + state = STRING |
| 59 | + break |
| 60 | + } |
55 | 61 | } |
56 | | - break; |
57 | | - case STRING: |
58 | | - switch(string[i]) { |
59 | | - case '"': state = JSON; break; |
60 | | - case '\\': state = ESCAPE; break; |
| 62 | + break |
| 63 | + } |
| 64 | + case STRING: { |
| 65 | + switch (string[i]) { |
| 66 | + case '"': { |
| 67 | + state = JSON |
| 68 | + break |
| 69 | + } |
| 70 | + case '\\': { |
| 71 | + state = ESCAPE |
| 72 | + break |
| 73 | + } |
61 | 74 | } |
62 | | - break; |
63 | | - case ESCAPE: |
64 | | - state = STRING; |
65 | | - break; |
| 75 | + break |
| 76 | + } |
| 77 | + case ESCAPE: { |
| 78 | + state = STRING |
| 79 | + break |
| 80 | + } |
66 | 81 | } |
67 | 82 | } |
68 | 83 |
|
69 | | - var result = { |
| 84 | + const result = { |
70 | 85 | jsons: [], |
71 | 86 | remainder: string.substring(bounds[bounds.length - 1].end), |
72 | 87 | } |
73 | 88 |
|
74 | 89 | bounds.forEach(function(v) { |
75 | | - result.jsons.push(string.substring(v.start, v.end)); |
76 | | - }); |
| 90 | + result.jsons.push(string.substring(v.start, v.end)) |
| 91 | + }) |
77 | 92 |
|
78 | | - return result; |
| 93 | + return result |
79 | 94 | } |
0 commit comments