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 op null. Het werkt hetzelfde als de tweede parameter van JSON.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 breaks
value: 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 stringified
loc: CommentLocation
}
interface CommentLocation {
// The start location begins at the `//` or `/*` symbol
start: Location
// The end location of multi-line comment ends at the `*/` symbol
end: Location
}
interface Location {
line: number
column: 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(`
// comment
1
`)
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(`
// comment
null
`)
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 van source 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 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

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.