- Notifications
You must be signed in to change notification settings - Fork253
json5/json5
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
JSON5 is an extension to the popularJSON file format that aims to beeasier towrite and maintainby hand (e.g. for config files).It isnot intended to be used for machine-to-machine communication.(Keep using JSON or other file formats for that. 🙂)
JSON5 was started in 2012, and as of 2022, now gets>65M downloads/week,ranks in thetop 0.1% of the most depended-upon packages on npm,and has been adopted by major projects likeChromium,Next.js,Babel,Retool,WebStorm,andmore.It's also natively supported onApple platformslikemacOS andiOS.
Formally, theJSON5 Data Interchange Format is a superset of JSON(so valid JSON files will always be valid JSON5 files)that expands its syntax to include some productions fromECMAScript 5.1 (ES5).It's also asubset of ES5, so valid JSON5 files will always be valid ES5.*
This JavaScript library is a reference implementation for JSON5 parsing and serialization,and is directly used in many of the popular projects mentioned above(where e.g. extreme performance isn't necessary),but others have createdmany other librariesacross many other platforms.
The following ECMAScript 5.1 features, which are not supported in JSON, havebeen extended to JSON5.
- Object keys may be an ECMAScript 5.1IdentifierName.
- Objects may have a single trailing comma.
- Arrays may have a single trailing comma.
- Strings may be single quoted.
- Strings may span multiple lines by escaping new line characters.
- Strings may include character escapes.
- Numbers may be hexadecimal.
- Numbers may have a leading or trailing decimal point.
- Numbers may beIEEE 754 positive infinity, negative infinity, and NaN.
- Numbers may begin with an explicit plus sign.
- Single and multi-line comments are allowed.
- Additional white space characters are allowed.
Kitchen-sink example:
{// commentsunquoted:'and you can quote me on that',singleQuotes:'I can use "double quotes" here',lineBreaks:"Look, Mom! \No \\n's!",hexadecimal:0xdecaf,leadingDecimalPoint:.8675309,andTrailing:8675309.,positiveSign:+1,trailingComma:'in objects',andIn:['arrays',],"backwardsCompatible":"with JSON",}
A more real-world example isthis config filefrom the Chromium/Blink project.
For a detailed explanation of the JSON5 format, please read theofficialspecification.
npm install json5
constJSON5=require('json5')
importJSON5from'json5'
<!-- This will create a global `JSON5` variable. --><scriptsrc="https://unpkg.com/json5@2/dist/index.min.js"></script>
<scripttype="module">importJSON5from'https://unpkg.com/json5@2/dist/index.min.mjs'</script>
The JSON5 API is compatible with theJSON API.
Parses a JSON5 string, constructing the JavaScript value or object described bythe string. An optional reviver function can be provided to perform atransformation on the resulting object before it is returned.
JSON5.parse(text[, reviver])
text
: The string to parse as JSON5.reviver
: If a function, this prescribes how the value originally produced byparsing is transformed, before being returned.
The object corresponding to the given JSON5 text.
Converts a JavaScript value to a JSON5 string, optionally replacing values if areplacer function is specified, or optionally including only the specifiedproperties if a replacer array is specified.
JSON5.stringify(value[, replacer[, space]])JSON5.stringify(value[, options])
value
: The value to convert to a JSON5 string.replacer
: A function that alters the behavior of the stringificationprocess, or an array of String and Number objects that serve as a whitelistfor selecting/filtering the properties of the value object to be included inthe JSON5 string. If this value is null or not provided, all properties of theobject are included in the resulting JSON5 string.space
: A String or Number object that's used to insert white space into theoutput JSON5 string for readability purposes. If this is a Number, itindicates the number of space characters to use as white space; this number iscapped at 10 (if it is greater, the value is just 10). Values less than 1indicate that no space should be used. If this is a String, the string (or thefirst 10 characters of the string, if it's longer than that) is used as whitespace. If this parameter is not provided (or is null), no white space is used.If white space is used, trailing commas will be used in objects and arrays.options
: An object with the following properties:replacer
: Same as thereplacer
parameter.space
: Same as thespace
parameter.quote
: A String representing the quote character to use when serializingstrings.
A JSON5 string representing the value.
When using Node.js, you canrequire()
JSON5 files by adding the followingstatement.
require('json5/lib/register')
Then you can load a JSON5 file with a Node.jsrequire()
statement. Forexample:
constconfig=require('./config.json5')
Since JSON is more widely used than JSON5, this package includes a CLI forconverting JSON5 to JSON and for validating the syntax of JSON5 documents.
npm install --global json5
json5 [options]<file>
If<file>
is not provided, then STDIN is used.
-s
,--space
: The number of spaces to indent ort
for tabs-o
,--out-file [file]
: Output to the specified file, otherwise STDOUT-v
,--validate
: Validate JSON5 but do not output JSON-V
,--version
: Output the version number-h
,--help
: Output usage information
git clone https://github.com/json5/json5cd json5npm install
When contributing code, please write relevant tests and runnpm test
andnpm run lint
before submitting pull requests. Please use an editor that supportsEditorConfig.
To report bugs or request features regarding the JSON5data format,please submit an issue to the officialspecification repository.
Note that we will never add any features that make JSON5 incompatible with ES5;that compatibility is a fundamental premise of JSON5.*
To report bugs or request features regarding thisJavaScript implementationof JSON5, please submit an issue tothis repository.
To report a security vulnerability, please follow the follow the guidelinesdescribed in oursecurity policy.
While JSON5 aims to be fully compatible with ES5, there is one exception whereboth JSON and JSON5 are not. Both JSON and JSON5 allow unescaped line andparagraph separator characters (U+2028 and U+2029) in strings, however ES5 doesnot. Aproposal to allow thesecharacters in strings was adopted into ES2019, making JSON and JSON5 fullycompatible with ES2019.
MIT. SeeLICENSE.md for details.
Aseem Kishore founded this project.He wrote ablog postabout the journey and lessons learned 10 years in.
Michael Bolin independently arrived at and publishedsome of these same ideas with awesome explanations and detail. Recommendedreading:Suggested Improvements to JSON
Douglas Crockford of course designed and builtJSON, but his state machine diagrams on theJSON website, ascheesy as it may sound, gave us motivation and confidence that building a newparser to implement these ideas was within reach! The originalimplementation of JSON5 was also modeled directly off of Doug’s open-sourcejson_parse.js parser. We’re grateful for that clean and well-documentedcode.
Max Nanasy has been an early and prolificsupporter, contributing multiple patches and ideas.
Andrew Eisenberg contributed the originalstringify
method.
Jordan Tucker has aligned JSON5 more closelywith ES5, wrote the official JSON5 specification, completely rewrote thecodebase from the ground up, and is actively maintaining this project.
About
JSON5 — JSON for Humans