Reputation: 6333
We'd like to parse JSON5 documents in the JVM, but the JSON5-specific libraries available on GitHub all appear to have very low support. As parsers are often magnets for security vulnerabilities, we'd prefer not to use a parser that isn't already being widely used and scrutinised by the community.
This got us to wondering: Can the optional features of the Jackson JSON parser be used to parse JSON5?
Upvotes: 17
Views: 4427
Reputation: 1660
Graham Lea's answer was great.
Here I'll add a couple of improvements Jackson has made in recent years.
ALLOW_TRAILING_DECIMAL_POINT_FOR_NUMBERS
(Since 2.14): Numbers may have a trailing decimal point.ALLOW_LEADING_PLUS_SIGN_FOR_NUMBERS
(Since 2.14): Numbers may begin with an explicit plus sign.Upvotes: 2
Reputation: 1861
For Javascript developers, you could use jsonc-parser which is developed by Microsoft. jsonc-parser
could be use in browser and node.js environment.
Here's an example that demonstrates how to use the "jsonc-parser" npm package to parse a JSON5 string:
import * as jsonc from 'jsonc-parser';
const jsonString = `{
// This is a JSON5 string!
"name": 'John Doe',
"age": 42,
"isMarried": false,
"pets": [
{
"name": 'Fluffy',
"type": 'cat'
}
]
}`;
const parsedJson = jsonc.parse(jsonString);
console.log(parsedJson);
Online Demo: JSON5 parser
Upvotes: -1
Reputation: 6333
By enabling the following optional Jackson parser features:
ALLOW_UNQUOTED_FIELD_NAMES
ALLOW_TRAILING_COMMA
ALLOW_SINGLE_QUOTES
ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER
ALLOW_NON_NUMERIC_NUMBERS
ALLOW_JAVA_COMMENTS
ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS
it seems possible to support all of JSON5's headline features except for:
Jackson has a number of optional features which can be enabled on a parser to make it more lenient in the way it parses.
Comparing these parser options to the headline features of JSON5, we find that the following are supported:
Object keys may be an ECMAScript 5.1 IdentifierName.
✅ Supported with the ALLOW_UNQUOTED_FIELD_NAMES
feature
Objects may have a single trailing comma.
Arrays may have a single trailing comma.
✅ Both supported with the ALLOW_TRAILING_COMMA
feature
Strings may be single quoted.
✅ Supported with the ALLOW_SINGLE_QUOTES
feature
Strings may span multiple lines by escaping new line characters.
Strings may include character escapes.
✅ Both of these appear to be supported by Jackson's ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER
feature, though the meaning or purpose of escaping here may differ subtly. DYOR.
Numbers may be IEEE 754 positive infinity, negative infinity, and NaN.
✅ Supported with the ALLOW_NON_NUMERIC_NUMBERS
feature
Single and multi-line comments are allowed.
✅ Supported with the ALLOW_JAVA_COMMENTS
feature.
The following JSON5 feature is partially supported by Jackson:
Numbers may have a leading or trailing decimal point.
✅ Leading decimal points are supported with the ALLOW_LEADING_DECIMAL_POINT_FOR_NUMBERS
feature.
⛔️ Jackson doesn't appear to have support for trailing decimal points.
There doesn't currently (mid-2021) appear to be any way to configure Jackson to permit the following JSON5 features:
Numbers may be hexadecimal.
Numbers may have a trailing decimal point.
Numbers may begin with an explicit plus sign.
Additional white space characters are allowed.
Upvotes: 35