JSON値に複数行の文字列を含めることができますか


114

Javaプログラムで読み取られるJSONファイルを作成しています。フラグメントは次のとおりです...

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble.
                  so i would like to write it in multiple lines.
                  but, i do NOT require any new lines in the output.
                  I need to split the string value in this input file only.
                  such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements.
                  the prev line, I have shown, without splitting just to give a feel of my problem"
    }
  }
}


17
私がこの連載JSONファイルとの読みやすさについてだと思いません(のためではなく、重複したロードされたデータで改行についてJSONで、複数行文字列)。JSONを長い文字列が含まれる構成ファイルとして使用するようなものだと考えてください。読みやすくするために、誰かがテキストエディターで文字列を編集している場合に備えて、文字列をハードラップすることは役立ちます。
zashu 2013

2
@zashu:ほとんどのテキストエディターにはソフトラップ機能があります。これは、ハードコードされた線幅よりもすぐに役立ちます。
2014

4
@LightnessRacesinOrbitがそのような長い行を含むファイルでgit diffを実行する(またはマージの競合を解決する)こともまた、苦痛です。
Hubert Kario、

1
これは、OPの質問を引用して、JSONの複数行文字列の複製です:「JSONに複数行文字列を含めることは可能ですか?ほとんど場合、視覚的に快適にするために、エディターでワードラップをオンにできると思いますが、ちょっと気になる...
Andre Figueiredo

回答:


61

仕様をチェック!JSON文法のcharプロダクションは、次の値を取ることができます。

  • 任意のUnicode文字-例外"-または- \または制御文字
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 4桁の16進数

改行は「制御文字」なので、いいえ、文字列内にリテラルの改行がない場合があります。ただし、\nとの任意の組み合わせを使用してエンコードできます。\rあなたが必要としています。

JSONLintのあなたのJSONが無効であることを確認するツール。


更新:実際にデータに改行を含めずにJSON構文内に改行を記述したい場合は、2倍の運がありません。JSONはある程度人間に優しいことを意図していますが、それでもデータであり、そのデータに任意のフォーマットを適用しようとしています。それは、JSONの目的ではありません。


32

あなたの正確な要件はわかりませんが、「読みやすさ」を改善するための1つの可能な解決策は、配列として格納することです。

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : ["this is a very long line which is not easily readble.",
                  "so i would like to write it in multiple lines.",
                  "but, i do NOT require any new lines in the output."]
    }
  }
}

}

必要なときはいつでも再び参加する

result.join(" ")

13
それは意味がありません。それは抽象リークです。この方法で指定されたデータ形式は、本質的に壊れていると考えます。
オービットのライトネスレース

4
文字列の読みやすさを向上させるためだけにこの方法でAPIまたはJSONドキュメントを設計することは想像できません(私が推測するデバッグ目的のためだけに):| ....
アダムディガ16

「この方法で指定されたデータ形式は、本質的に壊れていると思います。」ただし、これはテストケース用であると考えてください。文字列をハードコーディングする場合は、おそらくプロパティファイルが必要です。通常、私は「実際の」データをJSONに格納しません。しかし、これがテストなしからテストへ行くための簡単な方法であるなら、それを試してください。
sf_jeff 2016

@AdamDygaは実際、jsonファイルをCVSに格納するのに役立ちます。デルタの単位は行です。
yota

7

あまり良い解決策ではありませんが、hjsonツールを試すことができます。リンク。エディターで複数行のテキストを記述し、適切な有効なJSON形式に変換できます。注:新しい行に '\ n'文字が追加されますが、「すべて置換」機能を使用して、任意のテキストエディターでそれらを削除できます。

PSは質問へのコメントでなければなりませんが、申し訳ありませんが、十分なレポを持っていません。


それは実際には良い考えです。Hjsonをバージョン管理し、必要に応じてJSONに変換します。
オービットのライトネスレース

3

私が理解できるように、質問は制御シンボルを使用して文字列を渡す方法ではなくjson、エディタ制御シンボルで文字列を分割できるファイルにjsonを保存および復元する方法についてです。

複数行の文字列をファイルに保存する場合、ファイルには有効なjsonオブジェクトが保存されません。しかし、あなたがあなたを使うならjson、プログラムでのみファイルてデータを保存し、プログラムに読み込んでjsonパーサーに渡すたびに、ファイルからすべての改行を手動で削除できます。

または、より良い方法jsonとして、必要に応じて文字列を編集するデータソースファイルを用意しjson、プログラムで使用する有効なファイルへのユーティリティを使用して、新しい行をすべて削除することもできます。


2

私が使用しているjsonインタープリターに依存していると思います...プレーンなJavaScriptでは、行末記号を使用できます

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble. \
                  so i would like to write it in multiple lines. \
                  but, i do NOT require any new lines in the output."
    }
  }
}

これは正しいですが、インデントスペースが出力されます:a\ c=> a c
Andre Figueiredo

1
JavaScriptには、これを受け入れる「JSONインタープリター」がありません。文字列のJSONのみを使用できます。確かに、文字列リテラル内にJSONを提供した場合、このアプローチを取ることができますが、それは異常なことです。JSONをJavaScriptの実際のオブジェクト宣言と混同していますか?
オービットのライトネスレース
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.