JSONフォーマットでいくつかのデータファイルを書いているのですが、とても長い文字列の値を複数行に分割したいのです。pythonのJSONモジュールを使うと、エスケープに `を使っても
n` を使っても、たくさんのエラーが出る。
JSONで複数行の文字列を持つことは可能ですか?ほとんど見た目の快適さのためなので、エディターでワードラップをオンにすればいいのでしょうが、ちょっと興味があります。
私は小さな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()
を使うだけです。
仕様をチェックしてください。! JSON文法の_char_プロダクションは、次の値を取ることができます。
-any-Unicode-character-except-"
-or-\
-or-control-character。
\ "
。\\
。\ /
。\ b
。\ f
。\ n
。\ r
。\ t
。
-\ u
4-hex-digits。ニューラインは「コントロール文字」なので、いいえ、文字列内に文字通りのニューラインがない場合があります。 ただし、必要な「\ n」と「\ r」の組み合わせを使用してエンコードできます。
残念ながら、ここでの回答の多くは、文字列データに改行文字を配置する方法の問題に対応しています。 問題は、コードの複数の行に文字列値を分割して、コードをより見栄えよくする方法です。 (そして、これを認識する回答でさえ、データ表現を自由に変更できると仮定する「解決策」を提供しますが、多くの場合、変更できません。)。
さらに悪いニュースは、良い答えがないことです。
多くのプログラミング言語では、線を越えた分割文字列を明示的にサポートしていなくても、文字列の連結を使用して目的の効果を得ることができます。コンパイラがひどくない限り、これは問題ありません。
しかし、jsonはプログラミング言語ではありません。単なるデータ表現です。 文字列を連結するように言うことはできません。 また、その(かなり小さい)文法には、複数の行で文字列を表すための機能も含まれていません。
ある種のプリプロセッサを考案する(そして私は、この問題を解決するために自分の言語を効果的に構成したくない)ことを除いて、この問題に対する一般的な解決策はありません。 データ形式を変更できる場合は、文字列の配列を置き換えることができます。 そうでなければ、これはjsonが人間の読みやすさのために設計されていない多くの方法の1つです。
これは本当に古い質問なんだけど、検索でこれを見つけたんだ。
JSONはデータ中の改行を許しません。YOU]2の回答を参照してください。質問によると、Pythonで改行をエスケープするには、行継続文字(" \"
)を使用するか、" \n"
をエスケープとして使用するかの2つの方法があるようです。
ただし、Pythonで文字列を使用する場合、特殊なエスケープ文字(" \t"
, " \n"
)はREAL制御文字に変換されます!は改行文字を表すASCII制御文字に置き換えられますが、これはまさにJSONでは不正な文字です。(行の継続文字については、単に改行が取り除かれます)。
そのため、Pythonが文字をエスケープしないようにする必要があります。これを行うには、生の文字列を使用する(r"abcndef"
のように文字列の前にr
を置く)か、改行の前に余分なスラッシュを含める("abcndef"
)。
上記のどちらも、" \n"
を実際の改行 ASCII 制御文字に置き換える代わりに、" \n"
を 2 つのリテラル文字のままにして、JSON が改行エスケープとして解釈できるようにします。
JSONでマルチライン文字列を使用することは可能ですか??。
はい。 F12を押し、コンソールをクリックして画面の下部に入力して、Firefox Webブラウザーでこれをテストしました。
x={text:"hello\nworld"}
オブジェクトxは、複数行の文字列を含むJSON形式の文字列から作成されました。
console.log(x.text)
hello
world
x.textが表示され、複数行の文字列であることを示します。
これらの2つのテストは、FirefoxのJavascriptインタープリターがマルチライン文字列を使用してJSONを作成して使用できることを嬉しく思っていることを示しています。
JSON.stringify
と JSON.parse
を使用したその他のテストでは、Javascriptインタープリターがマルチライン文字列を含むオブジェクトを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
newlineの文字列は、スペースのある文字列よりも長くはないことに注意してください。 キーボードで2文字( '\'と 'n')が入力されましたが、文字列には1文字しか保存されません。
文字列の配列としてプロパティ値を書き込みます。 ここで与えられた例のようにhttps://gun.io/blog/multi-line-strings-in-json/。 これは役立ちます。
次のようなマルチライン文字列には、いつでも文字列の配列を使用できます。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
また、配列を簡単に反復して、コンテンツを複数行で表示することもできます。
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モジュールをロードします。JSモジュールは、Node.jsで簡単にJSON文字列化できるJSオブジェクトを作成します。 -eオプションは文字列を評価し、 -p
オプションは最後のNode.js操作の戻り結果をstdoutにエコーします。
別の作業ディレクトリにある.jsスクリプトをロードする場合は、「」文字列と「」文字列を切り替える必要があります。
my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`
base64
エンコードされた文字列値を使用してみてください。 ほとんどの場合私のために働いた。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
base64
の後、エンコードされた文字列は次のようになります。
{
"singleLine": "Some singleline String",
"multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
}
base64のエンコーディングとデコードは、すべての言語で利用できます。