コメント付きのJSONを解析して文字列化します。 保存後もコメントを保持します!
- コメント付きの JSON 文字列を JavaScript オブジェクトにパースし、コメントを維持します
- JSON ファイルのあらゆる場所、そう、あらゆる場所でのコメントをサポートし、最終的には配列内のコメントについての既知の問題を修正します😆
- 。
- もしあれば、コメント付きの JSON 文字列にオブジェクトを文字列化します
comment-json
の使用法は、バニラの JSON
オブジェクトと全く同じです。
目次
- Why and How
- Usage and examples
- API reference
- parse
- stringify
- assign
- CommentArray
- Change Logs
なぜなのでしょうか?
コメント付きの JSON を処理できるライブラリは、json5 や strip-json-comments など他にもたくさんありますが、解析されたオブジェクトを文字列化して、元のコンテンツと同じ JSON 文字列を返せるものはありません。
ユーザー設定が ${library}.json
, に保存されていて、ユーザーが読みやすくするために多くのコメントを書いた場合を想像してみてください。 ライブラリ library
がユーザー設定を変更する必要がある場合、たとえば、いくつかのプロパティ値を変更したり、新しいフィールドを追加したり、そして、ライブラリが設定を読み取るために json5
を使用する場合、すべてのコメントは変更後に消え、人々を狂わせることになります。
どうやって?
comment-json
はコメント付きの JSON 文字列をパースし、コメントトークンをシンボルのプロパティに保存します。
コメント付きの JSON 配列については、comment-json
は vanilla Array
オブジェクトを CommentArray
に拡張し、コメント配列を変更してもコメントの変更ができるインスタンスを作成できます。
Install
$ npm i comment-json
TypeScript 開発者にとっては、@types/comment-json
が使えるかもしれません
2.4.1
から、comment-json
には Typescript 宣言が含まれているので、@types/comment-json
を削除してもいいかもしれません。
Usage
package.json:
{// package name"name": "comment-json"}
Sort keys
JSONファイルのキーをソートするのはよくある使用例
assign
についてはこちらを参照してください。
parse()
parse(text, reviver? = null, remove_comments? = false): object | string | number | boolean | null
- text
string
JSONとしてパーズする文字列を指定します。 JSONの構文については、JSONオブジェクトを参照してください。 - reviver?
Function() | null
デフォルトはnull
。JSON.parse
の第2パラメータと同じ働きをします。 関数の場合、パースによって生成された値がどのように変換されて返されるかを指定します。boolean = false
trueの場合、コメントは維持されません。これは、クリーンなオブジェクトを取得したい場合によく使われます。
与えられたJSONテキストに対応するobject | string | number | boolean | null
を返します。
content
の場合は:
そしてparsed
の値は:
シンボルのプロパティは8種類あります。
そして、各シンボルプロパティの値は、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}
コメントなしのオブジェクトに解析する
console.log(parse(content, null, true))
そしてその結果は、こうなるのです。
{foo: 1,bar:}
特殊なケース
const parsed = parse(`// comment1`)console.log(parsed === 1)// false
原始型のJSONをremove_comments:false
でパースすると、parse()
の戻り値がオブジェクト型になる。
parsed
の値は、
Wich is similar for:
-
Boolean
type -
String
type
例えば
const parsed = parse(`"foo" /* comment */`)
Which is equivalent to
ただ例外が1点だけあります。
const parsed = parse(`// commentnull`)console.log(parsed === null) // true
stringify()
stringify(object: any, replacer?, space?): string
引数はバニラのJSON.stringify
と同じです。
そしてバニラと同様のことをするが、余分なプロパティも扱い、コメントに変換する。
console.log(stringify(parsed, null, 2))// Exactly the same as `content`
space
スペースが指定されていない場合、あるいは空文字列の場合、stringify()
の結果にはコメントがないことになる。
上記の場合:
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
the target object - source?
object
ソースとなるオブジェクトです。 このパラメータはオプションですが、この引数を渡さないのは馬鹿げています。 - keys?
Array<string>
指定されない場合、source
のすべての列挙可能な自身のプロパティが使用されます。
このメソッドは、列挙可能な自身のプロパティとそれに対応するコメント記号プロパティをターゲットオブジェクトにコピーするために使われます。
キーに関する特殊なケース
ただし、引数keys
を指定して空ではない場合、コメントbefore all
、これはプロパティなしに属しているためコピーされません。
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// {// "bar": "baz",// // This is a comment// "foo": "bar"// }
引数keys
に空の配列を指定すると、コメント
const obj = assign({bar: 'baz'}, parsed, )stringify(obj, null, 2)// // before all// {// "bar": "baz",// }
の非プロパティシンボルだけがコピーされることを示しています。
Symbol.for('before-all')Symbol.for('before')Symbol.for('after-all')
CommentArray
Advanced Section
解析済みオブジェクトの配列はすべて CommentArray
s であることを示します。
CommentArray
のコンストラクタは次のようにアクセスできます:
const {CommentArray} = require('comment-json')
コメント配列を変更すると、そのコメント記号プロパティは自動的に処理されるかもしれません:
Oh yeah !
その代わり、
末尾のカンマに関する特殊なケース
JSON 文字列 str
がある場合、その文字列は、 str
コメント記号のプロパティは、
コメントはすべて削除される。