JSONの複数行文字列


656

一部のデータファイルをJSON形式で書き込んでおり、本当に長い文字列値を複数行に分割したいと考えています。PythonのJSONモジュールを使用\する\nと、使用するかエスケープとして使用するかにかかわらず、多くのエラーが発生します。

JSONに複数行の文字列を含めることはできますか?それは主に視覚的な快適さのためですので、エディターでワードラップをオンにできると思いますが、ちょっと気になります...



1
データを構造化します。複数行の文字列を文字列の配列に分割し、後で結合します。
RubyTuesdayDONO 2018年

2
hjsonツールを試してください。jsonの複数行の文字列を適切なjson形式に変換します。
gaurav

回答:


403

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

例えば:

"first line second line"

以下で保存できます:

"first line\nsecond line"

注意:

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

"first line\\nsecond line"

どこ\\バックスラッシュをエスケープするためのもので、それ以外のpythonは扱います\n制御文字「改行」として


89
-1 OP "\ n"エスケープシーケンスを使用しています。"\\ n"のようにバックスラッシュをエスケープしていないため、機能しません。したがって、Pythonは、エスケープシーケンスを、JSONが要求するように、文字どおりバックスラッシュの後にenが続くのではなく、改行文字に変換します。
user359996 2013年

6
@ user359996それが本当かどうかはわかりません。私(JustでデータをJSONに格納し、\nそれをCurses経由で出力する)では、\n問題なく動作するようです。それはビュー/レンダリングエンジンに依存しているようです。
ashes999 2014年

2
改行シーケンスは確かにプラットフォーム固有です(en.wikipedia.org/wiki/Newline#Representationsを参照)。ただし、Orbitの回答の@Lightness Racesによると、JSON文法にはカーソルリターン文字もラインフィード文字もありません。私は実際にはPythonプログラマではないので、あなたのケースで何が起こっているのかわかりませんが、あなたのパーサーが壊れているか、あなたが思っているものを渡していないのです。多分この答えはそれをよりよく説明します:stackoverflow.com/a/9295597/359996。ダブルエスケープについては特に注意してください。
user359996 14年

5
@Nawaz:「\ n」と「\ r」は、それぞれラインフィードとキャリッジリターンのエスケープシーケンスです。これらは、リテラルのラインフィードおよびキャリッジリターン制御文字ではありません。より明確にするための追加の例として、 "\\"がリテラルのバックスラッシュではなく、バックスラッシュのエスケープシーケンスであると考えてください。JSON文法は制御文字(「char」の定義を参照)を明示的に除外し、代わりにエスケープシーケンス(\\、\ r、\ nなど)を介してそれらの表現を提供します。
user359996

2
@ user359996:はい。後で見ましたが、以前のコメントはそのままにしていますが、他の誰かが同じ疑問を抱いた場合に備えて、私たちの議論が役立つかもしれません。ところでそれを確認してくれてありがとう。
Nawaz

197

私は小さな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()


40
これは特定の設定に対する解決策であり、必ずしも質問に関連しているわけではありません。ここで作成するのは、複数行の文字列(とにかく不可能)ではなく、内部に文字列を含む配列です
Samuel Rivas

3
これは、質問に答えない文字列に改行を挿入する方法を示しています。この答えはそうです。
fgrieu

1
fgrieu-改行を追加せずに文字列を連結するのと同じくらい簡単にできます。この小さな変更により、複数行文字列の回避策が提供されます(JSONスキーマの指定を制御できる限り)。これで答えを改善しようと思います。
drrob

1
ありがとう、私はこれが好きです。私が取り組んでいるもののためにこれで行きます。すっきりと整理されています。この配列の各改行は出力テキストの改行を意味しますが、この解決策は改行を挿入しない場合にも機能します。私がこのソリューションを以前に私のJavaScriptソースコードで使用したのは、それがどのように構成され、どのように空白が最終文字列に入るのかについて疑問を残さない方法が好きだったからです。
Gal

JSONの発明者の留保にもかかわらず、これを使用してコメントを追加し(JavaScript部分なし、[]とコンマのみ)、私の小さなJSONファイルを手動で編集する可能性のある将来のメンテナーを支援するためにコメントを追加しました。
Whirl Mind 2016

117

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

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

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

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

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


3
OPが何を望んでいるか、文字列の改行、文字列の整理が明確でない...
9ilsdx 9rvj 0lo

3
@ 9ilsdx9rvj0lo:いいえ、違います。
Mark Adelsberger、

「問題は、文字列値を複数行のコードに分割してコードをより見栄えよくする方法です...」:Pythonの複数行ステートメントの解決策については、stackoverflow.com / questions / 53162 /…を参照してください。複数行のJSONと複数行のPythonには違いがあります。複数行のJSONは、JSONで「\」の後に「n」が続く、つまり文字列の「\ n」を使用します。複数行のPythonステートメント。 '\'の後に '\ n'を続けます。つまり、継続する行の末尾にバックスラッシュを使用します。Windows形式:必要に応じて、\ nを\ r \ nに置き換えてください!
Ivan

106

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

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

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



3
あいまいさを残さないので、これは正解です。新しい行がされている限り、彼らは適切に制御文字でエスケープされているとして、仕様ごとに、許可されます。
Ryan

JSONの@AliKhaki \ nは、質問によって求められた結果を達成しません。別のことを考えている(つまり、改行文字を埋め込む)か、何らかのプログラミング言語の文字列リテラル(JSONを含む)の改行について話しているのですが、これもまた別のことです。
オービットでの軽さのレース

@LightnessRacesinOrbitはい文字列の改行を探しています
Ali Khaki

46

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

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


1
「ソフト」なラインラップをサポートするBBEditのようなエディタが理想的です。テキストは折り返されて、すべてがエディターウィンドウの表示領域内に表示されますが、ファイルに保存すると、入力した行末(たとえば、キャリッジリターン)だけがファイルに保持されます。コードのトリックやハックに頼る必要なく、本当に長い文字列でJSONを簡単に編集できます。
cshotton 2017

44

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

JSONは、データに「実際の」改行を許可しません。改行をエスケープすることしかできません。@YOUからの回答を参照してください。質問によると、Pythonでは改行を2つの方法でエスケープしようとしたようです:行継続文字()を使用するか、エスケープとして使用します。"\""\n"

ただし、Pythonで文字列を使用している場合は、特殊なエスケープ文字("\t""\n")がREAL制御文字に変換されることに注意してください。"\n"正確にはJSONでは違法である文字で改行文字を表すASCII制御文字に置き換えられます。(行継続文字については、単に改行を取り出します。)

したがって、Pythonが文字をエスケープしないようにする必要があります。これを行うには、生の文字列(のように文字列のr前に置くr"abc\ndef"か、または改行("abc\\ndef")の前にスラッシュを追加します。

上記のどちらも"\n"、実際の改行ASCII制御文字に置き換えるのではなく、"\n"2つのリテラル文字として残されます。これにより、JSONは改行エスケープとして解釈できます。


12

プロパティ値を文字列の配列として書き込みます。ここで与えられた例のようにhttps://gun.io/blog/multi-line-strings-in-json/。これは役立ちます。

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

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

また、配列を簡単に反復して、コンテンツを複数行で表示できます。


1
将来リンクが壊れる可能性があるため、リンクからの回答に情報を追加することをお勧めします。
YoungHobbit、2015年

5
しかし、それらには文字列ではなく配列があります。配列は文字列ではありません。限目。
9ilsdx 9rvj 0lo 2018年

ちょうどこれを考えていた。いいね!
フィリップジェイコブス

12

json5(ローダー)を使用https://json5.org/を参照-例(json5による)

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

OPが尋ねた質問。少なくとも彼がjson5を使用できる場合。
nomen

10

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

はい。F12キーを押し、コンソールをクリックして、画面の下部に入力して、Firefox Webブラウザーでこれをテストしました。

x={text:"hello\nworld"}

オブジェクトxは、複数行の文字列を含むJSON形式の文字列から作成されました。

console.log(x.text)
hello
world

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

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

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

私は過去に、シェイクスピアの全作品をプロパティとして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文字しか格納されません。


3
A JavaScriptの文字列形式のリーダーは、それが仕事に起こりつつ、JavaScriptコンソールも受け付け、その逆JSON文字列形式リーダーと副ない x={"a":NaN}x={"a":"a \<literal newline with SHIFT>b"}、JSONされていないが、JavaScriptがある

9

使用すると、すべての出現置き換えるためにregexで\r\n持つに\\n

これは私にとってscalaでうまくいきました。

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

なぜ3つのバックスラッシュなのですか?
neXus

6
@neXus理由はわかりませんが、誰かが3つのバックスラッシュに編集しました。それを修正してくれたLightnessRacesInOrbitに感謝します。
Sikander

5

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'))"`

-4

base64エンコードされた文字列値を使用してみてください。ほとんどの場合私のために働いた。

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

base64のようにエンコードされた文字列の外観

{
    "singleLine": "Some singleline String",
    "multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
} 

base64エンコードおよびデコードは、すべての言語で使用できます。


7
それを表示するには特別なコードが必要です。文字列を配列に変換します。それは解決策ではありません
tom10271

3
これは悪い考えだと思います。コンテンツを不必要に難読化し、コンテンツを生成および消費するために追加のコード、時間、メモリ、およびツールを必要とします。文字列全体をスキャンして特殊文字を置き換えるには、もちろん追加のコード、時間、メモリも必要ですが、base64のエンコードとデコードよりは間違いなく少ない
Semanino

JSONの可読性がなくなったため、これは悪い考えです。また、前述の@ tom10271のように、jsonを使用するには追加の操作が必要です
T90

-23

複数行のテキストをtxtファイルに入れてから

var str = {
    text: cat('path_to_file/text.txt')
}

(mongoDBで動作します)


11
-1:これは誤解を招く答えです。という名前の関数がないため、これは有効なJSONではなく、JavaScriptでも機能しませんcat
MartinSchuhfuß15年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.