{
  "flavors": {
    "truncated": "Cut off mid-stream; Content-Length matches what was sent.",
    "trailing-comma": "Trailing comma. Valid JSON5, invalid JSON.",
    "single-quotes": "Single-quoted strings. Python repr, not JSON.",
    "nan": "NaN and Infinity literals. Python json.dumps emits these by default.",
    "bom": "UTF-8 byte order mark before the JSON. Some parsers choke.",
    "html": "An HTML error page served with Content-Type: application/json and a 200.",
    "mislabeled": "Perfectly valid JSON served as text/html.",
    "empty": "Zero-byte body with Content-Type: application/json and a 200.",
    "unterminated": "Unterminated string with an escaped quote inside.",
    "bigint": "An integer above 2^53 and a number above double range. Precision loss or Infinity in most JS parsers.",
    "duplicate-keys": "Duplicate keys. Last-one-wins in most parsers, but not all.",
    "comments": "JSONC comments.",
    "leading-garbage": "A stray line before the JSON document.",
    "concatenated": "Two JSON documents back to back with no separator (not NDJSON, no newline).",
    "deep": "5,000 levels of nested arrays. Recursive parsers may blow the stack.",
    "utf16": "Valid JSON, encoded as UTF-16LE with a BOM, labeled charset=utf-8."
  },
  "usage": "/badjson/{flavor}"
}
