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
string
A JSON-ként elemzendő string. A JSON szintaxis leírását lásd a JSON objektumban. - reviver?
Function() | null
Alapértelmezés szerintnull
. Ugyanúgy viselkedik, mint aJSON.parse
má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 = false
Ha 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:
-
Boolean
type -
String
type
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
object
a célobjektum - source?
object
a 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 CommentArray
s.
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
.