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ă estenull
. Acționează la fel ca al doilea parametru dinJSON.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 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}
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(`// comment1`)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(`// commentnull`)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 dinsource
.
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 CommentArray
s.
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
.