Parse and stringify JSON with comments. Mentés után is megtartja a megjegyzéseket!
- JSON karakterláncokat elemez megjegyzésekkel JavaScript objektumokká és Megtartja a megjegyzéseket
- támogatja a megjegyzéseket mindenhol, igen, MINDENHOL egy JSON fájlban, végül 😆
- javítja a tömbökön belüli megjegyzésekkel kapcsolatos ismert problémát.
- Az objektumokat JSON karakterláncokká fűzi fel kommentárokkal, ha vannak
A comment-json használata pontosan ugyanaz, mint a vanília JSON objektumé.
Tartalomjegyzék
- Miért és hogyan
- Használat és példák
- API hivatkozás
- .
- parse
- stringify
- assign
- CommentArray
- Change Logs
Miért?
Sok más könyvtár is tud JSON-t kezelni megjegyzésekkel, mint például a json5, vagy a strip-json-comments, de egyik sem képes a tagolt objektumot stringelni és az eredeti tartalommal megegyező JSON stringet visszaadni.
Elképzeljük, hogy ha a felhasználói beállítások ${library}.json,-ben vannak elmentve, és a felhasználó sok megjegyzést írt az olvashatóság javítása érdekében. Ha a könyvtárnak library módosítania kell a felhasználói beállításokat, például néhány tulajdonságértéket módosítani és új mezőket hozzáadni, és ha a könyvtár json5-t használ a beállítások olvasására, akkor a módosítás után az összes megjegyzés eltűnik, ami az őrületbe kergeti az embereket.
Szóval, ha egy JSON stringet szeretne elemezni megjegyzésekkel, módosítani, majd visszamenteni, akkor a comment-json a kötelező választás!
Hogyan?
comment-json elemzi a JSON stringeket megjegyzésekkel, és a megjegyzés tokeneket szimbólum tulajdonságokba menti.
A JSON tömb megjegyzésekkel, comment-json kiterjeszti a vanília Array objektumot CommentArray-ra, amelynek példányai képesek kezelni a megjegyzések módosítását még a megjegyzés tömb módosítása után is.
Install
$ npm i comment-json
A TypeScript fejlesztők számára a @types/comment-json használható
Mióta 2.4.1, a comment-json typescript deklarációkat tartalmaz, így akár a @types/comment-json is eltávolítható.
Usage
package.json:
{// package name"name": "comment-json"}
Kulcsok rendezése
Egy JSON fájl kulcsainak rendezése gyakori felhasználási eset
A assign részleteit lásd itt.
parse()
parse(text, reviver? = null, remove_comments? = false): object | string | number | boolean | null
- text
stringA JSON-ként elemzendő string. A JSON szintaxis leírását lásd a JSON objektumban. - reviver?
Function() | nullAlapértelmezés szerintnull. Ugyanúgy viselkedik, mint aJSON.parsemásodik paramétere. Ha függvény, akkor azt írja elő, hogy az eredetileg elemzéssel előállított értéket hogyan alakítja át, mielőtt visszaadja. - remove_comments?
boolean = falseHa igaz, akkor a megjegyzések nem maradnak meg, amit gyakran használunk, amikor egy tiszta objektumot szeretnénk kapni.
A megadott JSON szövegnek megfelelő object | string | number | boolean | null visszaadja.
Ha a content:
És a parsed értéke lesz:
NYolcféle szimbólumtulajdonság van:
És az egyes szimbólumtulajdonságok értéke egy tömb: 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}
Parse in an object without comments
console.log(parse(content, null, true))
Az eredmény pedig a következő lesz:
{foo: 1,bar:}
Speciális esetek
const parsed = parse(`// comment1`)console.log(parsed === 1)// false
Ha egy primatív típusú JSON-t elemzünk remove_comments:false segítségével, akkor a parse() visszatérési értéke objektum típusú lesz.
A parsed értéke egyenértékű:
Mely hasonló a:
-
Booleantype -
Stringtype
Például
const parsed = parse(`"foo" /* comment */`)
Mely egyenértékű
De van egy kivétel:
const parsed = parse(`// commentnull`)console.log(parsed === null) // true
stringify()
stringify(object: any, replacer?, space?): string
Az argumentumok ugyanazok, mint a vanília JSON.stringify.
És hasonlót csinál, mint a vanília, de extra tulajdonságokkal is foglalkozik, és azokat kommentárrá alakítja.
console.log(stringify(parsed, null, 2))// Exactly the same as `content`
space
Ha a space nincs megadva, vagy a space egy üres karakterlánc, akkor a stringify() eredménye nem tartalmaz kommentárt.
A fenti esetben:
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
objecta célobjektum - source?
objecta forrás objektum. Ez a paraméter opcionális, de butaság ezt az argumentumot nem átadni. - keys?
Array<string>Ha nincs megadva, akkor asourceösszes felsorolható saját tulajdonsága felhasználásra kerül.
Ez a módszer a felsorolható saját tulajdonságok és a hozzájuk tartozó megjegyzésszimbólum tulajdonságok célobjektumba való másolására szolgál.
Különleges esetek a kulcsokról
De ha az keys argumentum meg van adva és nem üres, akkor a tulajdonságokhoz nem tartozó before all megjegyzés NEM lesz másolva.
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// {// "bar": "baz",// // This is a comment// "foo": "bar"// }
A keys argumentum üres tömbként való megadása azt jelzi, hogy csak a megjegyzések nem tulajdonságokhoz tartozó szimbólumait fogja másolni
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// // before all// {// "bar": "baz",// }
A nem tulajdonságokhoz tartozó szimbólumok közé tartoznak:
Symbol.for('before-all')Symbol.for('before')Symbol.for('after-all')
CommentArray
Előrészlet
Az elemzett objektum összes tömbje CommentArrays.
A CommentArray konstruktorát a következő módon érhetjük el:
const {CommentArray} = require('comment-json')
Ha módosítunk egy Comment tömböt, akkor a Comment szimbólum tulajdonságait automatikusan kezelhetjük.
Oh yeah! 😆
De vigyázzunk, ha egy kommenttömb tulajdonságát egy normál tömbhöz rendeljük át, az összes komment eltűnik:
Ehelyett azt kell tennünk:
Speciális esetek az utolsó vesszőről
Ha van egy JSON stringünk str
.