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 on null. Toimii samoin kuin JSON.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 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
}

Parseeraa objektiksi ilman kommentteja

console.log(parse(content, null, true))

Ja tulos on:

{
foo: 1,
bar:
}

Erikoistapaukset

const parsed = parse(`
// comment
1
`)
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(`
// comment
null
`)
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 kaikkia source: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 CommentArrays.

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

Vastaa

Sähköpostiosoitettasi ei julkaista.