コメント付きの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 デフォルトはnullJSON.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 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
}

コメントなしのオブジェクトに解析する

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

そしてその結果は、こうなるのです。

{
foo: 1,
bar:
}

特殊なケース

const parsed = parse(`
// comment
1
`)
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(`
// comment
null
`)
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

解析済みオブジェクトの配列はすべて CommentArrays であることを示します。

CommentArray のコンストラクタは次のようにアクセスできます:

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

コメント配列を変更すると、そのコメント記号プロパティは自動的に処理されるかもしれません:

Oh yeah !

その代わり、

末尾のカンマに関する特殊なケース

JSON 文字列 str

がある場合、その文字列は、 str

コメント記号のプロパティは、

コメントはすべて削除される。

コメントを残す

メールアドレスが公開されることはありません。