Parse and stringify JSON with comments. Se säilyttää kommentit myös tallennuksen jälkeen!
- Parseeraa JSON-merkkijonot kommentteineen JavaScript-objekteiksi ja PITÄÄ KOMMENTIT
- Tukee kommentteja kaikkialla, kyllä, KAIKISSA JSON-tiedostossa, lopulta 😆
- korjaa tunnetun ongelman, joka koskee kommentteja matriisien sisällä.
- Muodostaa objektit JSON-merkkijonoiksi, joissa on kommentteja, jos niitä on
Objektin comment-json
käyttö on täsmälleen sama kuin vanilja-objektin JSON
.
Sisällysluettelo
- Miksi ja miten
- Käyttö ja esimerkit
- API-viite
- .
- parse
- stringify
- assign
- CommentArray
- Change Logs
Miksi?
On monia muitakin kirjastoja, jotka voivat käsitellä JSON:ia kommenttien kanssa, kuten json5 tai strip-json-comments, mutta yksikään niistä ei pysty jäsentämään parsittua objektia merkkijonoksi ja palauttamaan takaisin JSON-merkkijonoa, joka vastaa alkuperäistä sisältöä.
Asettele, että jos käyttäjän asetukset tallennetaan ${library}.json
, ja käyttäjä on kirjoittanut paljon kommentteja luettavuuden parantamiseksi. Jos kirjaston library
täytyy muokata käyttäjän asetuksia, kuten muuttaa joitakin ominaisuuksien arvoja ja lisätä uusia kenttiä, ja jos kirjasto käyttää json5
lukemaan asetuksia, kaikki kommentit katoavat muokkauksen jälkeen, mikä tekee ihmiset hulluiksi.
Jos siis haluat jäsentää JSON-merkkijonon, jossa on kommentteja, muokata sitä ja tallentaa sen sitten takaisin, comment-json
on ehdoton valinta!
Miten?
comment-json
jäsentää JSON-merkkijonoja kommenteilla ja tallentaa kommenttimerkit symboliominaisuuksiin.
Kommentteja sisältäville JSON-joukoille comment-json
laajentaa vanilja-olion Array
objektin CommentArray
:ksi, jonka instanssit pystyisivät käsittelemään kommenttimuutoksia myös sen jälkeen, kun kommenttimassaa on muokattu.
Asennus
$ npm i comment-json
TypeScript-kehittäjille voisi käyttää @types/comment-json
.
Sen jälkeen kun 2.4.1
, comment-json
sisältää typescript-deklaraatioita, joten voit yhtä hyvin poistaa @types/comment-json
.
Käyttö
paketti.json:
{// package name"name": "comment-json"}
Lajittele avaimet
Yleinen käyttötapaus on lajitella JSON-tiedoston avaimet
Tarkemmat tiedot assign
:stä löydät täältä.
parse()
parse(text, reviver? = null, remove_comments? = false): object | string | number | boolean | null
- text
string
Merkkijono, joka halutaan jäsennellä JSON:ksi. Katso JSON-oliosta JSON-syntaksin kuvaus. - reviver?
Function() | null
Oletusarvo onnull
. Toimii samoin kuinJSON.parse
:n toinen parametri. Jos funktio, määrää, miten jäsennyksen alun perin tuottama arvo muunnetaan, ennen kuin se palautetaan. - remove_comments?
boolean = false
Jos true, kommentteja ei säilytetä, mitä käytetään usein, kun halutaan saada puhdas objekti.
Palauttaa object | string | number | boolean | null
, joka vastaa annettua JSON-tekstiä.
Jos content
on:
Ja parsed
:n arvo on:
Symboliominaisuuksia on KAHDENlaisia:
Ja jokaisen symboliominaisuuden arvo on joukko 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}
Parseeraa objektiksi ilman kommentteja
console.log(parse(content, null, true))
Ja tulos on:
{foo: 1,bar:}
Erikoistapaukset
const parsed = parse(`// comment1`)console.log(parsed === 1)// false
Jos parsimme primatiivisen JSON-tyypin remove_comments:false
:lla, niin parse()
:n paluuarvo on objektityyppinen.
Yksikön parsed
arvo vastaa:
Mikä vastaa:
-
Boolean
type -
String
type
Esimerkiksi
const parsed = parse(`"foo" /* comment */`)
Mikä vastaa:
Mutta yksi poikkeus on:
const parsed = parse(`// commentnull`)console.log(parsed === null) // true
stringify()
stringify(object: any, replacer?, space?): string
Argumentit ovat samat kuin vanilla JSON.stringify
.
Ja se tekee samanlaisen asian kuin vanilja, mutta käsittelee myös lisäominaisuuksia ja muuntaa ne kommenteiksi.
console.log(stringify(parsed, null, 2))// Exactly the same as `content`
space
Jos välilyöntiä ei ole määritetty tai välilyönti on tyhjä merkkijono, stringify()
:n stringify()
tuloksessa ei ole kommentteja.
Yllä olevassa tapauksessa:
console.log(stringify(result)) // {"a":1}console.log(stringify(result, null, 2)) // is the same as `code`
assign(kohde: objekti, lähde?: objekti, avaimet?: Array)
- kohde
object
kohdeobjekti - lähde?
object
lähdeobjekti. Tämä parametri on valinnainen, mutta on typerää jättää tämä argumentti antamatta. - keys?
Array<string>
Jos sitä ei määritetä, käytetään kaikkiasource
:n lueteltavia omia ominaisuuksia.
Tällä metodilla kopioidaan lueteltavat omat ominaisuudet ja niitä vastaavat kommenttisymboliominaisuudet kohdeobjektiin.
Erikoistapauksia avaimista
Mutta jos argumentti keys
on määritetty eikä se ole tyhjä, kommenttia before all
, joka ei kuulu mihinkään ominaisuuteen, EI kopioida.
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// {// "bar": "baz",// // This is a comment// "foo": "bar"// }
Argumentin keys
määrittäminen tyhjänä joukkona tarkoittaa, että kopioidaan vain kommenttien ei-ominaisuussymboleita
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// // before all// {// "bar": "baz",// }
Eiominaisuussymboleita ovat mm. seuraavat:
Symbol.for('before-all')Symbol.for('before')Symbol.for('after-all')
CommentArray
Edistyneempi jakso
Kaikki jäsennetyn objektin matriisit ovat CommentArray
s.
CommentArray
:n konstruktoria voisi käyttää:
const {CommentArray} = require('comment-json')
Jos muokkaamme kommenttimassamäärää, sen kommenttisymboliominaisuuksia voitaisiin käsitellä automaattisesti.
Oh yeah! 😆
Mutta ole tarkkana, jos osoitat kommenttimassan ominaisuuden uudelleen tavallisella massalla, kaikki kommentit häviävät:
Sen sijaan meidän pitäisi:
Erikoistapauksia jäljelle jäävästä pilkusta
Jos meillä on JSON-merkkijono str