Pars en stringify JSON met commentaar. Het zal commentaar behouden, zelfs nadat het is opgeslagen!
- Parseer JSON strings met commentaar in JavaScript objecten en BEHOUD commentaar
- Ondersteunt commentaar overal, ja ALLES in een JSON bestand, uiteindelijk 😆
- verhelpt het bekende probleem over commentaar in arrays.
- Stringify the objects into JSON strings with comments if there are
Het gebruik van comment-json is precies hetzelfde als het vanilla JSON object.
Inhoudsopgave
- Waarom en hoe
- Gebruik en voorbeelden
- API referentie
- parse
- stringify
- assign
- CommentArray
- Change Logs
Waarom?
Er zijn vele andere bibliotheken die JSON met commentaar kunnen verwerken, zoals json5, of strip-json-comments, maar geen van hen kan het geparsede object stringificeren en een JSON string teruggeven die gelijk is aan de oorspronkelijke inhoud.
Stel u voor dat de gebruikersinstellingen worden opgeslagen in ${library}.json, en de gebruiker heeft veel commentaar geschreven om de leesbaarheid te verbeteren. Als de bibliotheek library moet de gebruiker instelling te wijzigen, zoals het wijzigen van een aantal waarden van de eigenschap en het toevoegen van nieuwe velden, en als de bibliotheek gebruikt json5 om de instellingen te lezen, zullen alle opmerkingen verdwijnen na gewijzigd, die zal rijden mensen insane.
Dus, als je wilt een JSON-string met opmerkingen te ontleden, te wijzigen, en sla het dan terug, comment-json is uw must keuze!
Hoe?
comment-json parseert JSON strings met commentaar en slaat commentaartokens op in symbooleigenschappen.
Voor JSON array met commentaar breidt comment-json het vanilla Array object uit in CommentArray waarvan de instanties de veranderingen in commentaar kunnen verwerken, zelfs nadat een commentaar array is gewijzigd.
Installeer
$ npm i comment-json
Voor TypeScript-ontwikkelaars zou @types/comment-json kunnen worden gebruikt
Sinds 2.4.1 bevat comment-json typescriptdeclaraties, dus u kunt @types/comment-json net zo goed verwijderen.
Gebruik
package.json:
{// package name"name": "comment-json"}
Sleutels sorteren
Het is een veel voorkomende use-case om de sleutels van een JSON-bestand te sorteren
Voor details over assign, zie hier.
parse()
parse(text, reviver? = null, remove_comments? = false): object | string | number | boolean | null
- text
stringDe string om te parsen als JSON. Zie het JSON-object voor een beschrijving van de JSON-syntaxis. - reviver?
Function() | nullStandaard opnull. Het werkt hetzelfde als de tweede parameter vanJSON.parse. Indien een functie, schrijft voor hoe de oorspronkelijk door parsing geproduceerde waarde wordt getransformeerd, alvorens te worden geretourneerd. - remove_comments?
boolean = falseIndien true, worden de commentaren niet behouden, wat vaak wordt gebruikt wanneer we een schoon object willen verkrijgen.
Retourneert object | string | number | boolean | null die overeenkomt met de gegeven JSON tekst.
Als de content is:
En de waarde van parsed zal zijn:
Er zijn ACHT soorten symbool eigenschappen:
En de waarde van elke symbool eigenschap is een array van CommentToken
interface CommentToken {type: 'BlockComment' | 'LineComment'// The content of the comment, including whitespaces and line breaksvalue: string// If the start location is the same line as the previous token,// then `inline` is `true`inline: boolean// But pay attention that,// locations will NOT be maintained when stringifiedloc: CommentLocation}interface CommentLocation {// The start location begins at the `//` or `/*` symbolstart: Location// The end location of multi-line comment ends at the `*/` symbolend: Location}interface Location {line: numbercolumn: number}
Parseer in een object zonder commentaar
console.log(parse(content, null, true))
En het resultaat zal zijn:
{foo: 1,bar:}
Bijzondere gevallen
const parsed = parse(`// comment1`)console.log(parsed === 1)// false
Als we een JSON van primatief type parseren met remove_comments:false, dan zal de retourwaarde van parse() van het objecttype zijn.
De waarde van parsed is equivalent aan:
Wat gelijk is voor:
-
Booleantype -
Stringtype
Voorbeeld
const parsed = parse(`"foo" /* comment */`)
Wat gelijk is aan
Maar er is één uitzondering:
const parsed = parse(`// commentnull`)console.log(parsed === null) // true
stringify()
stringify(object: any, replacer?, space?): string
De argumenten zijn dezelfde als de vanille JSON.stringify.
En het doet hetzelfde als de vanilla, maar behandelt ook extra eigenschappen en zet ze om in commentaar.
console.log(stringify(parsed, null, 2))// Exactly the same as `content`
spatie
Als spatie niet is opgegeven, of als de spatie een lege tekenreeks is, zal het resultaat van stringify() geen commentaar bevatten.
Voor het bovenstaande geval:
console.log(stringify(result)) // {"a":1}console.log(stringify(result, null, 2)) // is the same as `code`
assign(target: object, source?: object, keys?: Array)
- target
objecthet doelobject - source?
objecthet bronobject. Deze parameter is optioneel, maar het is dom dit argument niet mee te delen. - sleutels?
Array<string>Indien niet opgegeven, zullen alle telbare eigen eigenschappen vansourceworden gebruikt.
Deze methode wordt gebruikt om de telbare eigen eigenschappen en hun overeenkomstige eigenschappen van commentaarsymbolen naar het doelobject te kopiëren.
Speciale gevallen over sleutels
Maar indien argument keys is opgegeven en niet leeg is, dan zal commentaar before all, dat tot geen enkele eigenschap behoort, NIET worden gekopieerd.
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// {// "bar": "baz",// // This is a comment// "foo": "bar"// }
Als argument keys als een lege matrix wordt opgegeven, betekent dit dat alleen niet-eigenschapssymbolen van opmerkingen zullen worden gekopieerd
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// // before all// {// "bar": "baz",// }
Niet-eigenschapssymbolen zijn onder andere:
Symbol.for('before-all')Symbol.for('before')Symbol.for('after-all')
CommentArray
Geavanceerde sectie
Alle arrays van het geparseerde object zijn CommentArrays.
De constructor van CommentArray zou kunnen worden benaderd door:
const {CommentArray} = require('comment-json')
Als we een commentaararray wijzigen, kunnen de eigenschappen van het commentaarsymbool automatisch worden afgehandeld.
Oh ja! 😆
Maar let op, als je de eigenschap van een commentaar array opnieuw toewijst aan een normale array, zullen alle commentaren weg zijn:
In plaats daarvan moeten we:
Speciale gevallen over Trailing Comma
Als we een JSON string hebben str