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
string
De string om te parsen als JSON. Zie het JSON-object voor een beschrijving van de JSON-syntaxis. - reviver?
Function() | null
Standaard 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 = false
Indien 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:
-
Boolean
type -
String
type
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
object
het doelobject - source?
object
het 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 vansource
worden 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 CommentArray
s.
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