Massive performance problems with bigger JSON files
spaceemotion opened this issue · 5 comments
Hey, we've just run into a major issue with jsonlint regarding performance today. Our requests were all timing out and stopped at the lexer. Here's a Sentry screenshot:
We've investigated the JSON that it tried to parse and while it was a bit bigger than usual, the parsing times were a LOT higher.
So I've done some digging. The following numbers are for formatted JSON files:
Lines (approx.) | execution time |
---|---|
10k | 1.89s user 0.03s system 96% cpu 1.989 total |
25k | 6.29s user 0.05s system 98% cpu 6.419 total |
40k | 25.82s user 13.47s system 99% cpu 39.521 total |
50k | 58.24s user 43.51s system 99% cpu 1:42.27 total |
As it turns out, the library is actually waiting for the system to do its thing.
A blackfire run with 3 samples on the 50k lines JSON shows that substr
seems to be the culprit:
Due to privacy concerns I can't share the JSON file, but there should be random JSON generators out there that can create files for you.
Many thanks in advance!
@spaceemotion can you try my PR (#65) on your JSON file ?
Also, can you give more information about the structure of your JSON file (is it big due to having lots of properties, a big depths or big string literals ?) ?
When doing my own profiling with a big random JSON file, I did not saw Lexer::lex
accounting for 86% of the time, but rather 50% for one of them and 18% for a bigger one (but bigger by the number of sibling properties). So I'm interested to see the impact on your input.
@stof Thanks for looking into this! I'll try to test the file against your changes soon.
It's essentially just a BIG list of objects up to 7 layers deep (with each object taking up to 1k lines each).
I can indeed confirm that the changes really did something. For my test files, here're the results:
approx. lines | results |
---|---|
50k | - before: 26.80s user 14.65s system 99% cpu 41.646 total - after: 5.31s user 0.03s system 99% cpu 5.356 total |
100k | - before: 365.36s user 321.47s system 99% cpu 11:29.88 total - after: 13.30s user 0.07s system 99% cpu 13.495 total |
Here's an anonymized JSON object which repeats like 200 times:
{
"XXXXXYXXX": [],
"XXXXXXXXXYXXXXXX": 1,
"XXXXXYXXXXXXX": [
{
"XXXX": "XXXXXXXXXX XXXXXXXXXXXXXXXXX",
"XXXXX": "XXXXXXXXXX XXXXXXXXXXXXXXXXX",
"XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXX1111XXXXXXXXXXXXXXXX11X1111.XXX"
},
{
"XXXX": "XXXXXXXXXXX",
"XXXXX": "XXXXXXXXXXX",
"XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXX1111X11X1111X11XXXXXXXXXXXXXXXXXXXXXXXX.XXX"
},
{
"XXXX": "XXXXXXXX XXX XXXXXXXXXXX",
"XXXXX": "XXXXXXXX XXX XXXXXXXXXXX",
"XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1X1111X11.XXX"
},
{
"XXXX": "XXXXXXXXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXX",
"XXXXX": "XXXXXXXXXXXXXXXXX XX XXXXXXXXXXXXXXXXXXXXXX",
"XXX": "XXXXX:XXXXXXXXXXXXXXXXXX-XXXXXX1.XXXXXXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXX11111XXXX1111X111111.XXX"
}
],
"XXXXXXXXXXXXXXXXXX": {
"XXXXXXXXXXXXX": "11.111.111",
"XXXXXXXX": "1",
"XXXXXXXXXXYXX": ""
},
"XXXXYXXXXX": "1111",
"XXXX": "XXXXXXX",
"XXXXXXXXXXXX": {
"XXXXXXXXXX": "111",
"XXXXX": "1111",
"XXXX": "XXXXXX",
"XXYXX": "11111",
"XXXXXXX": {
"XXXXXXX": "XXXXXXXXXXX",
"XXXX": {
"XXXXXXXXXXXXXXXX": [
"XXXXXXXXXXX"
]
},
"XXXXXX": [
{
"XYXXX": "XXXXXXXXXXX",
"XXXYX": "XXXXXXXXXXX"
}
]
},
"XXXXXXXXXXX": 1
},
"XXXXXXXXXXXYXXXXXXXX": {
"XXXYXX": "1111-11-11",
"XXXXXXX": {
"XXXXXXXXX": 1,
"XXXXXX": 11.11
},
"XXXXXX": "1111-11-11"
},
"XXXXXXXXXXXXXXXXX": false,
"XXXXXXX": "",
"XXXXXXXXXXXXX": "111111111111111",
"XXXXXXXXXXXXXXX": {
"XXXX": 111,
"XXX": "XXXXX:XXXXXXXXXXXXXXXX.XXXX-XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1111XXXXXXXXXXXXXXX111111111111111XXXXXXX1X1XXX1111X11111XX1X1111X1X1111X1XX1XX1XXXXXXXXXXX1",
"XXXXXXXX": {
"XXXXXXXX": [
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXXXXXXXXX XX XXXXXXXX XXX XX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX, XXXX XXXXX XXXXXX XXX XXXXX11XXXXXXXX, XXXX XXXX XXXXX XX XXXX XXXXXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XX-XXXX, XXXXXXXXXXXXXX11XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXXXXX XX XXXXXXXX XXXX XXXXXXXXXXXXXX11X1XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX, XXXXXXXXXXXXX XXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXX11X1XXXX XXXXXX XXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XXXXXXXXX XX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XX XXXXXXXX XXXXXXX11X1XXXXXX XXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXX XXXXXX, XXXX XXXXXXX11X1XXXX, XXX XXX XXXXXXXXX11XX XXX XXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXX- XXX XXXXXXXXXXXXXXXXXXX XXX11XXX 1 XXXXXXXXXXXXXXX XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXX- XXX XXXXXXXXXXXXXXXXXXX XXX11XXX 1 XXXXXXXXXXXXXXX XXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX11X1XXXXX XXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXXXX XXX XXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXXXX XXXXXXXXXX-XXXXXXXX XX XXXXXXXXXXXXXXX XXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXXXX XXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XXX XXXXXXXXXX XXXXXXXX XXXXXXXXX XXX XX XXXXX XXXXXXXXXXXXXXXXXXXX XXX 11.111 XXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXXXXXXXX XXXXXXX11X1XXX XXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXX XXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXX11XXXXXXXXXXXX XXXXXXXXX XXX XXXXXXXXX XXX11X1XXXXX XXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXX XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXX XXXX false, XXXXXX XXXXX XXXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX XXXXXXXXXXXXXXX XXX XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXX XXX 1 XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXX XX11XXXXX 1 false, XXX XXX XXX XXXXX XX11X1XXXXXXXXXXX XXXXX XXX XXXX11X1XXXX XXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXX XXXXXXXXXXXXXXXX XXX 11 XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXX-XXXXX11X1XX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXX-XXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXX XXX11X1XXXXXXXXX XX XXXXXX XXXXXXXX XXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXX11XXXXX XXXXXXX XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX XXXXXXX XXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXX XXX11X1XXXXXXX XXX XXXXXXXXXXXXX-XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXXXXX XXX11X1XXXXXXX XXX XXXXXXXXXXXXX-XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXX XX XXXXXXXXXXXXXXX XXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX. XXXXXXXXXX: XXXXXXXXXXXXXXX XXX XXXXX11X1XXX XX XXXXXXXXXX11X1XXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX XXXXX XXX11X1XXXXXXX XXXXX11X1XXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX11X1XXXXXXXXXXXXXXX11X1XXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXXX XXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXXX XXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX-XXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXX11X1XXXXXXXXXXXXXX11X1XXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX XX XXXXXXXX XXX XXXXXXXXXXXX XXX XXXXXXXXX11X1XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXX11XXXXX XXX XXXXXXXXXXXXXXXXXXXXXXX11X1XXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXX11X1XXX XX XXXXXXX XXXXXXXXXX, XXXXXXXXXX XXXXXX ",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXX, XXXXXXX XXXXXX11XXXXXX ",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX XXXXX XXXXXXX- XXXX XXXXXXXXXXXXX XXXXXX11XXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXX, XXXXXXX XXXX-X XXXXXX11XXXXXX XXXXX XXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX11X1XXXXXXXXX11X1XXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXXXXXXXXXXXXXXX XXXXXXX11X1XX11XXXX XXXXX XXX XXXX. XXXXXXXXXXXXXXXXXXXXXXX XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX, 1-XXXX XXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXX11XXXXX XXXXX XXXXX11X1XXX XXX XXXXXX11X1XXXXXXXXXX- XXXX XXXXXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXX XXXXXXX11XXXXX XXX-XXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XX"
}
],
"XXXXXXXXXXXXX": [
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXX XXXX false, XXXX XXXXX XXXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXX XXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX XXX11X1XXXXXXX XX XXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXX XXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXXX, XXXXXXXX, XXXXX11X1XXXXXXX, XXXXXXXXXXXXXXXXXX X. XXX.",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXX XXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXX11X1XXX XXXXX XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXX XXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXX XXX XXXXXXXXXXXX11X1XXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXX XXXXXXXXXX"
}
],
"XXXXXXXXXXXXXXXXX": [
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXXXX XXX11XXX XXXXXX XXXX XXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXX XXX 1 XXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXXXXX XXX11XXX XXXXXX XXXX XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXX XXX 1 XXXX"
},
{
"XXXXX": "XXXXXXXXXXX XXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXX XX XXXXXXXX XXXXXXX XXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXXX XXXX XX XXXXXXXX XXX XX XXXXXXX XXXXXXXXXXXXXXX11X1XXXX XXX XXXXXXX XXXXXXXXXXX11XXXXXXXX XXXXXXXX XXXXX. XXXXXXXXXX 1X"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXXXXX XXX 111.111 XXX, XXX XXXXXXXXXXXX XXX XX XXXXX XXXXXXXX 111.111 XXX XXX11XXX XXXXXXXX XXXXXXXXXXX XXX. XXXX XXXXXXXXXX XX XXXXXXXXXXXXXXX XXXX "
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "1 XXXXXXXXXX XXXXXXXXX11XXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX 11.111 XX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXX XXXXXXXXXXXXX XXXX XXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX 1 XXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX XXXXXXXXX XXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XXX XXXXXXXXXX XXXXX XXX- XXXX XXXXXXXXXXXX-XXXXXXXX-XXXXXXXXXXXXXXXXX XXXX XXXXX XXXXXXXXXXXXX XXXXX XXX XXXXXXXXX XXX11X1XXXX XX XXXXXXXXXXXX XXXXXXX"
},
{
"XXXXX": "XXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXX XXX11XXX XXXXXXXXXXXXXX XXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXXXXXXX: XX, XXXXXXXX, XXXXXXX, XXXXXX, XXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXX XXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXX XXXXXXXXXXXX, XXXXXXXXXXXXXXX XXXXXXXXXXX XXX 11 XX XXXXXXXXXX XXX XXXXXXXXXXX XXXXXXXXXXX XXX 1 XX XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX XXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX 11 XX XXXXXXXXX11X1XXX, XXXX XXX XXXXX- XXXX XXXX11XXXXXXXXXXXXXXX XXX 11 XXXX11 XX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX XXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX 11 XXXX11 XX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX11XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX 1 XXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXX XXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXXX XXXXXXXX XXXXXXXXXXXX, XXXXXXXXXXXXXXX XXXXXXXXXXX XXX 11 XX XXXXXXXXXX XXX XXXXXXXXXXX XXXXXXXXXXX XXX 1 XX XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XX- XXX XXXXXXXXXXXX11X1XXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 11.111 XXX, 1-XXXX XXXXXXXXX"
},
{
"XXXXX": "XXXX-, XXXXX- XXX XXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXX11XXXXXXXXXXX XXX XXXXXXXXXX XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX XXX XXX XXXX XXX XXX XXX11XXXXXXXXXXX XXX XXX-XXXXXXXXXXXXXXXXXXXX XXXXXXXXX XXXXXXXX11X1XXX XXX XXXXXX 1 XXXXX"
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX11X1XXXXX XXXXXXXX11X1XXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XX XXXXX XXXXXXXXXXXXXXXXXX XXX 11.111 XXX XXXX X.X. XXXXXXXXX XXX XXXXX-XXXXXXXXXXXXXXXXXXXXX, XXXXXXXXXXXXXXXXXX, XXXXXXXXXXXXXXXX X.XX11X1."
},
{
"XXXXX": "XXXXXXXX XXX11X1XXXXXXXXX XXX XXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXX XX XXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX XXX XXXXXXXXX XX XXXXXXXXXXXXXXXX XXX XXXXX11XXXXX XXX. XXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXX-XXXXXXXXXXXXXX: XXX XXXXXXX-XXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXX11X1XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX 111 XXXXX XX XXXXXXXXXXXXX, XXX. 1.111 XXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXXXXXXX: XXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXX11X1XXX XXXXX XXXXXXXXXXXXXXXXXXXX XXXXXXXXX11X1XXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": true,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXX XXXXXX11XXXXXX XXX XXXXXXXX, XXXXXX11X1XXXX XXX.",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXXX XXXXXX- XXX XXXXXXXX11XXXXXXXXXXXX11XXXXXX, XXXXX XXXXXXXXXX XXX XXXXXX11XXXXXXX XX XXX11X1XXXX XXX XXXXXXXXX XXXXXXXXXXX XXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXX11XXXXXXXXXXXXX: XXXXXXX XXXXXXXXXXX XXXXXX11XXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XX XXXXXX XXX XXXXXXXXXXXXXX XXX11XXX XXXXXXXX- , XXXX- XXX XXXXXX11X1XXXXXXXXX11X1XXX, XXXXX XXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX XXX11X1XXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXX11X1XXX XXXXX XXXXXXXXXXX11X1XXXX XXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 111.111 XXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXX11XXXXX XXX XXXXXXXXX11X1XXX XXX XXXXXXXXXXXX XXXX XXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 11.111 XXX"
},
{
"XXXXX": "XXXXXXXXXXXXXXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXX11X1XXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "XXX 11 XXXXXX, XXX. 1.111 XXX, XXXXX XXXXXXXXXX XXX XXXXX11X1XXX X.X. XX XXXXXXXXXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXX XXX11XXX XX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXX XXXXXXXX XXX11XXX XXXXXX XXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXX XXXXXXXX XXX11XXX XXXXXX XXXXXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXXXX XXX 11 XXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XX11X1XXXXXXXXX-XXXXXXXXXX XXXXXXX11XXXXX XXXX XXX XXXXXXXXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXXXXXXX11X1XXXXXXXXXXXXX: 1.111.111 XXX, 1-XXXX XXXXXXXXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXXXXXXXXXXXXXXX XXX XXXXXXXXXXXXX11X1XXX",
"XX": "XXXXXX1XXXXXXXXXXX1",
"XXXXXXXXX": false,
"XXXXXXX": "XXX 111.111 XXX"
},
{
"XXXXX": "XXXXXXXXX",
"XXXXXXXXXXXX": "XXX11X1XXXXXX XXXXXXXXXXXXXX",
"XX": "XXXXXX1XXXXXXXXXXX11",
"XXXXXXXXX": false,
"XXXXXXX": "11.111.111 XXX XXXX 11.111.111 XXX XXXXX, XX XXXXXXX11X1XXXXX XXXXXX XXX. 11.111.111 XXX"
}
]
}
},
"XXXXXXXXXXXXXXXXXXXX": "XXXXX:XXXXXXXXXXXXXXXX.XXXX-XXXXXXX.XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX1111XXXXXXX111XXXXXXXXXXXXXXX111111111111111XXXXXXX1X1XXX1111X11111XX1X1111X1X1111X1XX1XX1",
"XXXXXXXXXX": "",
"XXXXXXXXX": "11111XX"
}
This is I guess mostly fixed by #65 so closing, but please note that using this library to parse json is pretty awful as there is no way it can be as fast as json_decode().
The better way IMO is to parse with json_decode, and if that returns null you parse again with jsonlint to get a proper error message out, something like we do in Composer: