web-dev-qa-db-ja.com

JSONでの複数行の文字列

私はいくつかのデータファイルをJSONフォーマットで書いていて、本当に長い文字列値を複数の行に分割したいと思います。 pythonのJSONモジュールを使用すると、\または\nをエスケープとして使用するかどうかにかかわらず、かなり多くのエラーが発生します。

JSONに複数行の文字列を含めることは可能ですか?見た目の快適さを重視しているので、エディタでWordの折り返しを有効にすることもできますが、ちょっと興味があります...

501
Anonnobody

_ json _ は実際の改行を許可しません。すべての改行を\nに置き換える必要があります。

例えば:

"first line second line"

で保存することができます:

"first line\nsecond line"

注意:

Pythonの場合、これは次のように書く必要があります。

"first line\\nsecond line"

\\は円記号をエスケープするためのもので、そうでなければpythonは\nを制御文字 "new line"として扱います。

324
YOU

私はこれを小さなNode.jsプロジェクトのためにしなければならず、 回避策 :を見つけました。

{
 "modify_head": [

  "<script type='text/javascript'>",
  "<!--",
  "  function drawSomeText(id) {",
  "  var pjs = Processing.getInstanceById(id);",
  "  var text = document.getElementById('inputtext').value;",
  "  pjs.drawText(text);}",
  "-->",
  "</script>"

 ],

 "modify_body": [

  "<input type='text' id='inputtext'></input>",
  "<button onclick=drawSomeText('ExampleCanvas')></button>"

 ],
}

これは私にはかなりきちんと見えます、そこから私はいたるところで二重引用符を使わなければならないということから始めます。そうでなければ、おそらく、私はYAMLを使用できますが、それには他の落とし穴があり、ネイティブにサポートされていません。一度解析したら、各文字列の後に改行を入れるかどうかに応じて、myData.modify_head.join('\n')またはmyData.modify_head.join()を使います。

173
errordeveloper

チェックアウト 仕様 ! JSON文法の char プロダクションは、次の値を取ります。

  • 任意のUnicode文字(-"-または-\-または制御文字を除く)
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 4桁の16進数

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

JSONは読みやすさのために改行を許可していません。

あなたの最善の策はあなたのために折り返すIDEを使うことです。

35
James Gentes

これは本当に古い質問ですが、私は検索でこれに遭遇しました、そして、私はあなたの問題の原因を知っていると思います。

JSONはそのデータに「本当の」改行を許可しません。改行をエスケープすることしかできません。 answer from @YOU を参照してください。質問によると、Pythonで改行をエスケープしようとしたように見えます。それは、行継続文字("\")を使う方法と"\n"をエスケープとして使う方法です。

ただし、Pythonで文字列を使用している場合は、特殊なエスケープ文字("\t""\n")がREAL制御文字に変換されます。 "\n"は改行文字を表すASCII制御文字に置き換えられます。これは正確にはJSONでは無効な文字です。 (行継続文字は、単に改行を入れるだけです。)

だからあなたがする必要があるのはPythonが文字をエスケープするのを防ぐことです。生の文字列を使う(r"abc\ndef"のように文字列の前にrを置くか、改行の前に余分なスラッシュを入れる("abc\\ndef")ことによってこれを行うことができます。

上記の両方で、"\n"を実際の改行文字ASCII制御文字で置き換える代わりに、"\n"を2つのリテラル文字として残し、JSONは改行エスケープとして解釈できます。

35
HardlyKnowEm

残念ながら、ここでの回答の多くは、文字列データに改行文字をどのように入れるかという問題に対処しています。問題は、文字列値を複数行のコードに分割することによって、コードをどのように見栄えよくするかです。 (そしてこれを認識する答えでさえ、データ表現を自由に変更できると仮定する「解決策」を提供しますが、多くの場合そうではありません。)

さらに悪いことに、良い答えはありません。

多くのプログラミング言語では、文字列を複数行に分割することを明示的にサポートしていなくても、文字列連結を使用して目的の効果を得ることができます。そして、コンパイラがひどくない限り、これは問題ありません。

しかしjsonはプログラミング言語ではありません。それは単なるデータ表現です。文字列を連結するように言うことはできません。その(かなり小さい)文法には、複数行で文字列を表現するための機能も含まれていません。

ある種のプリプロセッサを考案しただけでは(私にとっては、この問題を解決するために自分の言語を効果的に構成したいとは思わないでください)、この問題に対する一般的な解決策はありません。データ形式を変更できる場合は、文字列の配列を代用できます。そうでなければ、これはjsonが人間が読みやすいように設計されていない多くの方法のうちの1つです。

27

JSONに複数行の文字列を含めることは可能ですか?

はい。 F12キーを押して[console]をクリックし、画面の下部に入力して、Firefox Webブラウザでこれをテストしたところです。

x={text:"hello\nworld"}

Object xは、複数行の文字列を含むJSON形式の文字列から作成されたばかりです。

console.log(x.text)
hello
world

複数行の文字列であることを示すx.textが表示されます。

これら2つのテストは、FirefoxのJavascriptインタプリタが複数行の文字列を持つJSONを作成して使用するのに満足していることを示しています。

JSON.stringifyJSON.parseを使ったさらなるテストでは、Javascriptインタープリタが複数行の文字列を含むオブジェクトをJSONに変換し、それを再度問題なく解析できることを示しました。

私は過去にShakespeareの全作品をJSONオブジェクトのプロパティとして保存し、それからそれをインターネット上で破損することなく送信してきました。

これは3行に渡って入力された2行の文字列です。

x={text:"expert\
s\nex\
change"}

オブジェクトを表示することができます

console.log(x)

与える

Object { text: "experts\nexchange" }

または文字列

console.log(x.text)

与える

experts
exchange

文字列の行末は\ nを使用した結果であり、複数の入力行は行末に\を使用することで実現されます。

実際には、行末を文字列内の行末と同期させることをお勧めします。

x={text:"experts\n\
exchange"}

複数行ストリング長

console.log("Hello\nWorld".length)
11 
console.log("Hello World".length)
11

改行を含む文字列は、スペースを含む文字列より長くはありません。キーボードで2文字(「\」と「n」)を入力しても、文字列に格納される文字は1文字だけです。

13
user3070485

プロパティ値を文字列の配列として書き込みます。ここに挙げた例のように https://gun.io/blog/multi-line-strings-in-json/ 。これは助けになるでしょう。

次のように、複数行の文字列には常に文字列の配列を使用できます。

{
    "singleLine": "Some singleline String",
    "multiline": ["Line one", "line Two", "Line Three"]
} 

また、配列を簡単に反復して複数行の形式でコンテンツを表示することもできます。

11
Sandip Nirmal

正規表現を使用して、すべての\r\n\\nに置き換えます。

これは、私にとっては非常に役に立ちました。

val newstr = str.replace("\r\n", "\\n")
9
Sikander

Json5(ローダー)を使用する https://json5.org/ - exampleを参照)

{
  lineBreaks: "Look, Mom! \
No \\n's!",
}
3
Lacom

Node.jsを使用したい場合は、これを実行できます。

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

node.jsを使ってインポートし、それをJSONに簡単に変換することができます。

echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`

そしてあなたが得る:

{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}

仕組み :Node.jsを使ってJSモジュールをロードし、Node.jsによって簡単にJSON文字列化できるJSオブジェクトを作成する-eオプションは文字列を評価し、-pオプションは最後のNode.js操作の結果をstdoutにエコーします。

別の作業ディレクトリにある.jsスクリプトをロードしたい場合は、文字列 ""と ''を切り替える必要があります。

my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
1
Alexander Mills