jsonvetdocsConformance matrix

playgroundthis page on GitHub

Conformance matrix

How 27 parser runs treat the same files in JSON5, JSONC, JWCC (HuJSON), JSON Lines and strict JSON: 18 other parsers, plus jsonvet in each dialect and the duplicate-key variants. Each dialect's table lists the parsers that claim that dialect. Run on 2026-11-10; a full run took 108 s. How it works and how to rerun it: conformance/README.md.

Cells: ✓ the parser agrees with the expected verdict, ✗ it disagrees, ‼ it crashed or took longer than 10 s. Where the spec allows both verdicts (expected: either), the cell shows what the parser did: A accepted, R rejected. Duplicate keys count as valid in the syntax tables (jsonvet runs with --ignore duplicate-key); they have their own table.

Expected verdicts come from the spec where it decides the case (marked †, with the section under the table), from the json5-tests file extension, from conformance/extra/, or else from jsonvet's reviewed corpus snapshot. Where jsonvet disagrees with a spec, its column shows ✗ like any other parser.

JSON5

Spec: https://spec.json5.org/. 171 files, 166 scored.

parser agrees disagrees crash or timeout
js-json5 166 (100%) 0 0
py-json5 165 (99%) 1 2
py-pyjson5 165 (99%) 1 0
go-json5 151 (91%) 15 0
rs-json5 166 (100%) 0 0
rs-serde-json5 156 (94%) 10 0
jsonvet-json5 166 (100%) 0 0

Files where at least one parser disagrees (26):

file expected js-json5 py-json5 py-pyjson5 go-json5 rs-json5 rs-serde-json5 jsonvet-json5
corpus/json5/bare-key-against-comment.json valid ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/bom.json valid † ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/combining-mark-in-key.json valid † ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/escape-letter.json valid † ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/escaped-key-equals-quoted.json valid ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/escaped-key-part.json valid ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/hex-and-friends.json valid † ✓ ✓ ✓ ✗ ✓ ✗ ✓
corpus/json5/letter-u0e33-starts-key.json valid † ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/negative-hex.json valid † ✓ ✓ ✓ ✓ ✓ ✗ ✓
corpus/json5/raw-u2028-in-string.json valid † ✓ ✓ ✓ ✓ ✓ ✗ ✓
json5-tests/comments/irregular-block-comment.json valid ✓ ✓ ✓ ✗ ✓ ✓ ✓
json5-tests/numbers/negative-hexadecimal.json5 valid ✓ ✓ ✓ ✓ ✓ ✗ ✓
json5-tests/numbers/negative-zero-hexadecimal.json5 valid ✓ ✓ ✓ ✓ ✓ ✗ ✓
json5-tests/numbers/positive-hexadecimal.json5 valid ✓ ✓ ✓ ✓ ✓ ✗ ✓
json5-tests/numbers/positive-infinity.json5 valid ✓ ✓ ✓ ✓ ✓ ✗ ✓
json5-tests/numbers/positive-zero-hexadecimal.json5 valid ✓ ✓ ✓ ✓ ✓ ✗ ✓
json5-tests/todo/unicode-escaped-unquoted-key.json5 valid ✓ ✓ ✓ ✗ ✓ ✓ ✓
json5-tests/todo/unicode-unquoted-key.json5 valid ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/combining-mark-starts-key-escaped.json invalid † ✓ ✗ ✗ ✓ ✓ ✗ ✓
corpus/json5/line-comment-ends-at-u2028.json invalid † ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/punctuation-u00b7-in-key.json invalid † ✓ ✓ ✓ ✓ ✓ ✗ ✓
corpus/json5/unclosed-comment-own-star-slash.json invalid † ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/unclosed-comment.json invalid † ✓ ✓ ✓ ✗ ✓ ✓ ✓
json5-tests/comments/unterminated-block-comment.txt invalid ✓ ✓ ✓ ✗ ✓ ✓ ✓
corpus/json5/depth-10000.json either † A ‼ R A A A A
corpus/json5/depth-10001.json either † A ‼ R A A A R
Files where every parser agrees (145)
file expected js-json5 py-json5 py-pyjson5 go-json5 rs-json5 rs-serde-json5 jsonvet-json5
corpus/json5/comment-like-strings.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/comment-then-duplicate-trailing-comma.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/comment-then-duplicate.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/comment-then-trailing-commas.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/crlf-counts-once.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/dollar-keys.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/duplicate-in-array.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/duplicate-key-nested.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/duplicate-key.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/duplicates-nested-escaped-in-arrays.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/escaped-newline-in-string.json valid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/key-like-string-and-comment.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/line-comment-ends-at-u2028-clean.json valid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/lone-cr-moves-positions.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/many-duplicates.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/nan-infinity.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/plain-json.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/quote-styles-same-key.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/single-quoted-slashes.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/top-level-scalar.json valid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/valid-comment-trailing-comma.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/empty-array.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/regular-array.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/trailing-comma-array.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-following-array-element.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-following-top-level-value.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-in-string.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-preceding-top-level-value.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-with-asterisks.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-following-array-element.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-following-top-level-value.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-in-string.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-preceding-top-level-value.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/misc/npm-package.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/misc/npm-package.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/misc/readme-example.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/misc/valid-whitespace.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/comment-cr.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/comment-crlf.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/comment-lf.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/escaped-cr.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/escaped-crlf.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/escaped-lf.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-leading-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-leading-zero.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-trailing-decimal-point-with-integer-exponent.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-trailing-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-with-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-lowercase-letter.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-uppercase-x.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-with-integer-exponent.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/infinity.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-zero-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-zero-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-zero-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/nan.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float-leading-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float-leading-zero.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float-trailing-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-infinity.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-integer.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-float-leading-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-float-trailing-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-float.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-integer.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float-leading-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float-leading-zero.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float-trailing-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-integer.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-float-leading-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-float-trailing-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-float.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-integer.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-float-leading-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-float-trailing-decimal-point.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-float.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-hexadecimal.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-integer-with-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-integer.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/duplicate-keys.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/empty-object.json valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/reserved-unquoted-key.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/single-quoted-key.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/trailing-comma-object.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/unquoted-keys.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/strings/escaped-single-quoted-string.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/strings/multi-line-string.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/strings/single-quoted-string.json5 valid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/combining-mark-starts-key.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/double-comma-array.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/duplicate-then-bad-escape.json invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/empty.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/error-position.json invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/escape-nine.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/key-with-dash.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/lone-comma-array.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/lone-comma-object.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/missing-value.json invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/number-led-key.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/raw-newline-in-string.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/unclosed-escape-double.json invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/unclosed-escape-single.json invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/unclosed-openers.json invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/whitespace-only.json invalid † ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/leading-comma-array.js invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/lone-trailing-comma-array.js invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/no-comma-array.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/top-level-block-comment.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/comments/top-level-inline-comment.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/misc/empty.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-empty.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-float-exponent.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-hexadecimal-exponent.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-float-exponent.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-hexadecimal-exponent.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-float-exponent.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-hexadecimal-exponent.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/lone-decimal-point.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-noctal.js invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-octal.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-octal.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/noctal-with-leading-octal-digit.js invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/noctal.js invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/octal.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-noctal.js invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-octal.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-octal.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-octal.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/illegal-unquoted-key-number.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/illegal-unquoted-key-symbol.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/leading-comma-object.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/lone-trailing-comma-object.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/objects/no-comma-object.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
json5-tests/strings/unescaped-multi-line-string.txt invalid ✓ ✓ ✓ ✓ ✓ ✓ ✓
corpus/json5/integer-5000-digits.json either † A R R R R R A
corpus/json5/mark-u1885-starts-key.json either † R R R R R R R
corpus/json5/not-utf8.json either † R R R A R R R

Spec notes (†):

Notable disagreements:

JSONC

Spec: https://jsonc.org/. 11 files, 9 scored.

parser agrees disagrees crash or timeout
js-jsonc-parser 9 (100%) 0 0
js-strip-json-comments 8 (89%) 1 0
go-tidwall-jsonc 8 (89%) 1 0
rs-jsonc-parser 7 (78%) 2 0
jsonvet-jsonc 9 (100%) 0 0

Files where at least one parser disagrees (3):

file expected js-jsonc-parser js-strip-json-comments go-tidwall-jsonc rs-jsonc-parser jsonvet-jsonc
extra/jsonc/lone-cr-ends-comment.jsonc valid † ✓ ✗ ✗ ✓ ✓
extra/jsonc/comment-only.jsonc invalid † ✓ ✓ ✓ ✗ ✓
extra/jsonc/json5-syntax.jsonc invalid † ✓ ✓ ✓ ✗ ✓
Files where every parser agrees (8)
file expected js-jsonc-parser js-strip-json-comments go-tidwall-jsonc rs-jsonc-parser jsonvet-jsonc
extra/jsonc/line-comment-at-end.jsonc valid † ✓ ✓ ✓ ✓ ✓
corpus/jsonc/comments.json valid ✓ ✓ ✓ ✓ ✓
extra/jsonc/block-comment-unclosed.jsonc invalid † ✓ ✓ ✓ ✓ ✓
extra/jsonc/hash-comment.jsonc invalid † ✓ ✓ ✓ ✓ ✓
extra/jsonc/nested-block-comment.jsonc invalid † ✓ ✓ ✓ ✓ ✓
corpus/jsonc/line-comment-not-ended-by-u2028.json invalid † ✓ ✓ ✓ ✓ ✓
extra/jsonc/trailing-comma-array.jsonc either † R R A A R
corpus/jsonc/trailing-comma.json either † R R A A R

Spec notes (†):

Notable disagreements:

JWCC (HuJSON)

Spec: https://nigeltao.github.io/blog/2021/json-with-commas-comments.html. 11 files, 10 scored.

parser agrees disagrees crash or timeout
go-hujson 9 (90%) 1 0
jsonvet-jwcc 10 (100%) 0 0

Files where at least one parser disagrees (1):

file expected go-hujson jsonvet-jwcc
extra/jwcc/line-comment-at-end.json valid † ✗ ✓
Files where every parser agrees (10)
file expected go-hujson jsonvet-jwcc
extra/jwcc/trailing-comma-array.json valid † ✓ ✓
corpus/jwcc/trailing-comma-and-comment.json valid † ✓ ✓
extra/jwcc/cr-does-not-end-comment.json invalid † ✓ ✓
extra/jwcc/hash-comment.json invalid † ✓ ✓
extra/jwcc/hex-number.json invalid † ✓ ✓
extra/jwcc/lone-comma-object.json invalid † ✓ ✓
extra/jwcc/two-trailing-commas.json invalid † ✓ ✓
extra/jwcc/unquoted-key.json invalid † ✓ ✓
corpus/jwcc/single-quotes.json invalid † ✓ ✓
extra/jwcc/u2028-in-line-comment.json either † R A

Spec notes (†):

Notable disagreements:

JSON Lines

Spec: https://jsonlines.org/. 11 files, 11 scored.

parser agrees disagrees crash or timeout
py-jsonlines 9 (82%) 2 0
go-json-stream 7 (64%) 4 0
rs-serde-json-stream 7 (64%) 4 0
jsonvet-jsonl 11 (100%) 0 0

Files where at least one parser disagrees (6):

file expected py-jsonlines go-json-stream rs-serde-json-stream jsonvet-jsonl
extra/jsonl/scalars.jsonl valid † ✗ ✓ ✓ ✓
extra/jsonl/bom.jsonl invalid † ✗ ✓ ✓ ✓
extra/jsonl/trailing-blank-line.jsonl invalid † ✓ ✗ ✗ ✓
corpus/jsonl/blank-line.jsonl invalid † ✓ ✗ ✗ ✓
corpus/jsonl/two-values-on-a-line.jsonl invalid † ✓ ✗ ✗ ✓
corpus/jsonl/value-across-lines.jsonl invalid † ✓ ✗ ✗ ✓
Files where every parser agrees (5)
file expected py-jsonlines go-json-stream rs-serde-json-stream jsonvet-jsonl
extra/jsonl/crlf.jsonl valid † ✓ ✓ ✓ ✓
extra/jsonl/padded-line.jsonl valid † ✓ ✓ ✓ ✓
corpus/jsonl/crlf-duplicate.jsonl valid † ✓ ✓ ✓ ✓
corpus/jsonl/no-final-newline.jsonl valid † ✓ ✓ ✓ ✓
corpus/jsonl/valid.jsonl valid ✓ ✓ ✓ ✓

Spec notes (†):

Notable disagreements:

Strict JSON (baseline)

Spec: https://www.rfc-editor.org/rfc/rfc8259. 131 files, 129 scored.

parser agrees disagrees crash or timeout
js-json-parse 129 (100%) 0 0
py-json 124 (96%) 5 0
py-jiter 122 (95%) 7 0
rs-serde-json 127 (98%) 2 0
jsonvet-json 129 (100%) 0 0

Files where at least one parser disagrees (7):

file expected js-json-parse py-json py-jiter rs-serde-json jsonvet-json
corpus/i-json/lone-surrogate.json valid † ✓ ✓ ✗ ✗ ✓
corpus/json/lone-surrogates-are-distinct-keys.json valid † ✓ ✓ ✗ ✗ ✓
corpus/json/bare-infinity.json invalid ✓ ✗ ✗ ✓ ✓
corpus/json/nan-and-infinity.json invalid ✓ ✗ ✗ ✓ ✓
json5-tests/numbers/infinity.json5 invalid ✓ ✗ ✗ ✓ ✓
json5-tests/numbers/nan.json5 invalid ✓ ✗ ✗ ✓ ✓
json5-tests/numbers/negative-infinity.json5 invalid ✓ ✗ ✗ ✓ ✓
Files where every parser agrees (124)
file expected js-json-parse py-json py-jiter rs-serde-json jsonvet-json
corpus/i-json/duplicate-key.json valid † ✓ ✓ ✓ ✓ ✓
corpus/i-json/unsafe-integer.json valid † ✓ ✓ ✓ ✓ ✓
corpus/json/duplicate-key.json valid † ✓ ✓ ✓ ✓ ✓
corpus/json/plain.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/empty-array.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/regular-array.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-in-string.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-in-string.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/misc/npm-package.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-leading-zero.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-with-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-zero-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-zero-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-zero-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float-leading-zero.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-integer.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-float.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-integer.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-float.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-integer-with-integer-exponent.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-integer.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/duplicate-keys.json valid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/empty-object.json valid ✓ ✓ ✓ ✓ ✓
corpus/json/comment.json invalid ✓ ✓ ✓ ✓ ✓
corpus/json/infinity-runs-on.json invalid ✓ ✓ ✓ ✓ ✓
corpus/json/leading-zero.json invalid † ✓ ✓ ✓ ✓ ✓
corpus/json/nan-runs-on.json invalid ✓ ✓ ✓ ✓ ✓
corpus/json/negative-infinity-runs-on.json invalid ✓ ✓ ✓ ✓ ✓
corpus/json/trailing-comma-after-comment.json invalid ✓ ✓ ✓ ✓ ✓
corpus/json/unquoted-key.json invalid ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/leading-comma-array.js invalid ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/lone-trailing-comma-array.js invalid ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/no-comma-array.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/arrays/trailing-comma-array.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-following-array-element.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-following-top-level-value.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-preceding-top-level-value.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/block-comment-with-asterisks.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-following-array-element.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-following-top-level-value.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/inline-comment-preceding-top-level-value.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/irregular-block-comment.json invalid † ✓ ✓ ✓ ✓ ✓
json5-tests/comments/top-level-block-comment.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/top-level-inline-comment.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/comments/unterminated-block-comment.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/misc/empty.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/misc/npm-package.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/misc/readme-example.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/misc/valid-whitespace.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/comment-cr.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/comment-crlf.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/comment-lf.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/escaped-cr.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/escaped-crlf.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/new-lines/escaped-lf.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-leading-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-trailing-decimal-point-with-integer-exponent.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/float-trailing-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-empty.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-lowercase-letter.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-uppercase-x.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal-with-integer-exponent.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/hexadecimal.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-float-exponent.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-hexadecimal-exponent.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-float-exponent.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-negative-hexadecimal-exponent.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-float-exponent.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/integer-with-positive-hexadecimal-exponent.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/lone-decimal-point.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float-leading-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-float-trailing-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-hexadecimal.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-noctal.js invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-octal.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-float-leading-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-float-trailing-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-hexadecimal.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/negative-zero-octal.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/noctal-with-leading-octal-digit.js invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/noctal.js invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/octal.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float-leading-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float-leading-zero.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float-trailing-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-float.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-hexadecimal.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-infinity.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-integer.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-noctal.js invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-octal.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-float-leading-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-float-trailing-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-float.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-hexadecimal.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-integer.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/positive-zero-octal.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-float-leading-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-float-trailing-decimal-point.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-hexadecimal.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/numbers/zero-octal.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/illegal-unquoted-key-number.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/illegal-unquoted-key-symbol.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/leading-comma-object.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/lone-trailing-comma-object.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/no-comma-object.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/reserved-unquoted-key.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/single-quoted-key.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/trailing-comma-object.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/objects/unquoted-keys.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/strings/escaped-single-quoted-string.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/strings/multi-line-string.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/strings/single-quoted-string.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/strings/unescaped-multi-line-string.txt invalid ✓ ✓ ✓ ✓ ✓
json5-tests/todo/unicode-escaped-unquoted-key.json5 invalid ✓ ✓ ✓ ✓ ✓
json5-tests/todo/unicode-unquoted-key.json5 invalid ✓ ✓ ✓ ✓ ✓
corpus/i-json/bom.json either † R R R R A
corpus/json/bom.json either † R R R R A

Spec notes (†):

Notable disagreements:

Duplicate keys

Every spec here lets a parser keep one of the values, and JSON5 §3 also lets it fail. Only four parsers in the matrix can report duplicates: Python's json through an object_pairs_hook that raises, Python json5 with allow_duplicate_keys=False, jiter with catch_duplicate_keys=True, and jsonvet by default. The others have no switch for it in their sources, and accepted these files wherever their syntax allowed. A dash means the parser rejects the file's syntax, so the test says nothing.

file py-json-dupes py-json5-dupes py-jiter-dupes jsonvet-dupes
corpus/i-json/duplicate-key.json detected detected detected detected
corpus/json/duplicate-key.json detected detected detected detected
corpus/json5/bare-key-against-comment.json - detected - detected
corpus/json5/comment-then-duplicate-trailing-comma.json - detected - detected
corpus/json5/comment-then-duplicate.json - detected - detected
corpus/json5/crlf-counts-once.json detected detected detected detected
corpus/json5/dollar-keys.json - detected - detected
corpus/json5/duplicate-in-array.json detected detected detected detected
corpus/json5/duplicate-key-nested.json - detected - detected
corpus/json5/duplicate-key.json - detected - detected
corpus/json5/duplicates-nested-escaped-in-arrays.json detected detected detected detected
corpus/json5/escaped-key-equals-quoted.json - detected - detected
corpus/json5/escaped-key-part.json - detected - detected
corpus/json5/key-like-string-and-comment.json - detected - detected
corpus/json5/lone-cr-moves-positions.json - detected - detected
corpus/json5/many-duplicates.json detected detected detected detected
corpus/json5/quote-styles-same-key.json - detected - detected
corpus/jsonl/crlf-duplicate.jsonl - - - detected

Versions

parser language package version
js-json5 node json5 2.2.3
js-jsonc-parser node jsonc-parser 3.3.1
js-strip-json-comments node strip-json-comments 5.0.3
js-json-parse node - built in (node v26.12.0)
py-json python - built in (python 3.14.8)
py-json5 python json5 0.17.3
py-pyjson5 python pyjson5 2.0.1
py-jsonlines python jsonlines 4.0.0
py-jiter python jiter 0.17.0
py-json-dupes python - built in (python 3.14.8)
py-json5-dupes python json5 0.17.3
py-jiter-dupes python jiter 0.17.0
go-hujson go github.com/tailscale/hujson v0.0.0-20260727124030-b80ff77dac4f
go-json5 go github.com/titanous/json5 v1.0.0
go-tidwall-jsonc go github.com/tidwall/jsonc v0.3.3
go-json-stream go - built in (go go1.27.3)
rs-serde-json rust serde_json 1.0.154
rs-serde-json-stream rust serde_json 1.0.154
rs-json5 rust json5 1.3.2
rs-serde-json5 rust serde_json5 0.2.1
rs-jsonc-parser rust jsonc-parser 0.34.0
jsonvet-json jsonvet jsonvet 3.4.0 (51501e0)
jsonvet-json5 jsonvet jsonvet 3.4.0 (51501e0)
jsonvet-jsonc jsonvet jsonvet 3.4.0 (51501e0)
jsonvet-jwcc jsonvet jsonvet 3.4.0 (51501e0)
jsonvet-jsonl jsonvet jsonvet 3.4.0 (51501e0)
jsonvet-dupes jsonvet jsonvet 3.4.0 (51501e0)

Images: node:26-slim@sha256:e556a144463cc8dc53afe8de6d2fa0db5c132fd39ffa232c17641bd40df2bf11, python:3.14-slim@sha256:fbecd461fc72d21b2143c6eaba25143738079154a6d0ea3da3aec724f50eed4a, golang:1.27@sha256:f24164268fc1e741bbdc0066dbadcf1c8426c5a8489f0729c02c3905a53032fd, rust:1@sha256:767c71592f7d1f3f242292000f8efd4e67b6732363da176772f4d220332e264f. Runtimes: node v26.12.0; python 3.14.8; go go1.27.3; rust 1.99.1; jsonvet 3.4.0 (51501e0).