Parsează și stringe JSON cu comentarii. Va păstra comentariile chiar și după ce a fost salvat!

  • Parsează șirurile JSON cu comentarii în obiecte JavaScript și MANTINE comentariile
    • susține comentariile peste tot, da, ÎNTOTDEAUNA într-un fișier JSON, în cele din urmă 😆
    • rezolvă problema cunoscută cu privire la comentariile din interiorul matricelor.
  • Strânge obiectele în șiruri JSON cu comentarii dacă există

Utilizarea lui comment-json este exact la fel ca a obiectului JSON de vanilie.

Cuprins

  • De ce și cum
  • Utilizare și exemple
  • ReferințăAPI
      .

    • parse
    • stringify
    • assign
    • CommentArray
  • Schimbare jurnale

De ce?

Există multe alte biblioteci care se pot ocupa de JSON cu comentarii, cum ar fi json5, sau strip-json-comments, dar niciuna dintre ele nu poate să stringifice obiectul analizat și să returneze un șir JSON identic cu conținutul original.

Imaginați-vă că dacă setările utilizatorului sunt salvate în ${library}.json, și utilizatorul a scris o mulțime de comentarii pentru a îmbunătăți lizibilitatea. Dacă biblioteca library trebuie să modifice setările utilizatorului, cum ar fi modificarea unor valori ale proprietăților și adăugarea de noi câmpuri, iar dacă biblioteca folosește json5 pentru a citi setările, toate comentariile vor dispărea după modificare, ceea ce va înnebuni oamenii.

Așadar, dacă doriți să analizați un șir JSON cu comentarii, să îl modificați, apoi să îl salvați înapoi, comment-json este alegerea dvs. obligatorie!

Cum?

comment-json analizează șirurile JSON cu comentarii și salvează jetoanele de comentarii în proprietățile simbolurilor.

Pentru matricea JSON cu comentarii, comment-json extinde obiectul vanilie Array în CommentArray ale cărui instanțe ar putea gestiona modificările comentariilor chiar și după ce o matrice de comentarii este modificată.

Instalare

$ npm i comment-json

Pentru dezvoltatorii TypeScript, @types/comment-json ar putea fi folosit

Din moment ce 2.4.1, comment-json conține declarații typescript, deci ați putea la fel de bine să eliminați @types/comment-json.

Utilizare

pachet.json:

{
// package name
"name": "comment-json"
}

Sortarea cheilor

Este un caz comun de utilizare pentru a sorta cheile unui fișier JSON

Pentru detalii despre assign, vedeți aici.

parse()

parse(text, reviver? = null, remove_comments? = false)
: object | string | number | boolean | null
  • text string Șirul de analizat ca JSON. Consultați obiectul JSON pentru o descriere a sintaxei JSON.
  • reviver? Function() | null Valoarea implicită este null. Acționează la fel ca al doilea parametru din JSON.parse. Dacă este o funcție, prescrie modul în care este transformată valoarea produsă inițial prin parsare, înainte de a fi returnată.
  • remove_comments? boolean = false Dacă este adevărat, comentariile nu vor fi menținute, ceea ce este adesea folosit atunci când dorim să obținem un obiect curat.

Întoarce object | string | number | boolean | null corespunzător textului JSON dat.

Dacă content este:

Și valoarea lui parsed va fi:

Există opt tipuri de proprietăți de simboluri:

Și valoarea fiecărei proprietăți de simbol este o matrice de 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
}

Analizează într-un obiect fără comentarii

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

Și rezultatul va fi:

{
foo: 1,
bar:
}

Cazuri speciale

const parsed = parse(`
// comment
1
`)
console.log(parsed === 1)
// false

Dacă analizăm un JSON de tip primativ cu remove_comments:false, atunci valoarea returnată de parse() va fi de tip obiect.

Valoarea lui parsed este echivalentă cu:

Ceea ce este similară pentru:

  • Boolean tip
  • String tip

De exemplu

const parsed = parse(`
"foo" /* comment */
`)

Ceea ce este echivalentă cu

Dar există o excepție:

const parsed = parse(`
// comment
null
`)
console.log(parsed === null) // true

stringify()

stringify(object: any, replacer?, space?): string

Argumentele sunt aceleași ca și în cazul vaniliei JSON.stringify.

Și face un lucru similar cu cel de vanilie, dar se ocupă și de proprietățile suplimentare și le convertește în comentarii.

console.log(stringify(parsed, null, 2))
// Exactly the same as `content`

space

Dacă spațiul nu este specificat, sau dacă spațiul este un șir gol, rezultatul lui stringify() nu va avea comentarii.

Pentru cazul de mai sus:

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 obiectul țintă
  • source? object obiectul sursă. Acest parametru este opțional, dar este o prostie să nu se treacă acest argument.
  • keys? Array<string> Dacă nu este specificat, vor fi utilizate toate proprietățile proprii enumerabile din source.

Această metodă este utilizată pentru a copia proprietățile proprii enumerabile și proprietățile simbolului de comentariu corespunzător acestora în obiectul țintă.

Cazuri speciale despre chei

Dar dacă argumentul keys este specificat și nu este gol, atunci comentariul before all, care nu aparține niciunei proprietăți, NU va fi copiat.

const obj = assign({
bar: 'baz'
}, parsed, )
stringify(obj, null, 2)
// {
// "bar": "baz",
// // This is a comment
// "foo": "bar"
// }

Specificarea argumentului keys ca fiind o matrice goală indică faptul că se vor copia numai simbolurile care nu aparțin proprietăților din comentarii

const obj = assign({
bar: 'baz'
}, parsed, )
stringify(obj, null, 2)
// // before all
// {
// "bar": "baz",
// }

Simbolurile care nu aparțin proprietăților includ:

Symbol.for('before-all')
Symbol.for('before')
Symbol.for('after-all')

CommentArray

Secțiune avansată

Toate array-urile din obiectul analizat sunt CommentArrays.

Constructorul lui CommentArray ar putea fi accesat prin:

const {CommentArray} = require('comment-json')

Dacă modificăm un array de comentarii, proprietățile simbolului său de comentariu ar putea fi gestionate automat.

Oh da! 😆

Dar atenție, dacă realocăm proprietatea unui array de comentarii cu un array normal, toate comentariile vor dispărea:

În schimb, ar trebui:

Cazuri speciale privind virgula de urmărire

Dacă avem un șir JSON str

.

Lasă un răspuns

Adresa ta de email nu va fi publicată.