一部のデータファイルをJSON形式で書き込んでおり、本当に長い文字列値を複数行に分割したいと考えています。PythonのJSONモジュールを使用\
する\n
と、使用するかエスケープとして使用するかにかかわらず、多くのエラーが発生します。
JSONに複数行の文字列を含めることはできますか?それは主に視覚的な快適さのためですので、エディターでワードラップをオンにできると思いますが、ちょっと気になります...
一部のデータファイルをJSON形式で書き込んでおり、本当に長い文字列値を複数行に分割したいと考えています。PythonのJSONモジュールを使用\
する\n
と、使用するかエスケープとして使用するかにかかわらず、多くのエラーが発生します。
JSONに複数行の文字列を含めることはできますか?それは主に視覚的な快適さのためですので、エディターでワードラップをオンにできると思いますが、ちょっと気になります...
回答:
JSONは実際の改行を許可しません。すべての改行をに置き換える必要があり\n
ます。
例えば:
"first line
second line"
以下で保存できます:
"first line\nsecond line"
注意:
の場合Python
、これは次のように記述する必要があります。
"first line\\nsecond line"
どこ\\
バックスラッシュをエスケープするためのもので、それ以外のpythonは扱います\n
制御文字「改行」として
\n
それをCurses経由で出力する)では、\n
問題なく動作するようです。それはビュー/レンダリングエンジンに依存しているようです。
私は小さな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はプログラミング言語ではありません。これは単なるデータ表現です。文字列を連結するように指示することはできません。また、その(かなり小さい)文法には、文字列を複数の行で表す機能も含まれていません。
ある種のプリプロセッサを考案することなく(そして、私は、この問題を解決するために自分の言語を効果的に構成したくありません)、この問題に対する一般的な解決策はありません。データ形式を変更できる場合は、文字列の配列に置き換えることができます。それ以外の場合、これはjsonが人間が読みやすいように設計されていない多くの方法の1つです。
仕様をチェック!JSON文法のcharプロダクションは、次の値を取ることができます。
"
-または- \
または制御文字\"
\\
\/
\b
\f
\n
\r
\t
\u
4桁の16進数改行は「制御文字」なので、いいえ、文字列内にリテラルの改行がない場合があります。しかし、あなたはどんなの組み合わせを使用してそれをコードすることができる\n
し、\r
あなたが必要としています。
JSONは、読みやすくするために改行を許可していません。
あなたの最善の策は、あなたのために行折り返しするIDEを使うことです。
これは本当に古い質問ですが、私はこれを検索で見つけました。私はあなたの問題の原因を知っていると思います。
JSONは、データに「実際の」改行を許可しません。改行をエスケープすることしかできません。@YOUからの回答を参照してください。質問によると、Pythonでは改行を2つの方法でエスケープしようとしたようです:行継続文字()を使用するか、エスケープとして使用します。"\"
"\n"
ただし、Pythonで文字列を使用している場合は、特殊なエスケープ文字("\t"
、"\n"
)がREAL制御文字に変換されることに注意してください。"\n"
正確にはJSONでは違法である文字で改行文字を表すASCII制御文字に置き換えられます。(行継続文字については、単に改行を取り出します。)
したがって、Pythonが文字をエスケープしないようにする必要があります。これを行うには、生の文字列(のように文字列のr
前に置くr"abc\ndef"
か、または改行("abc\\ndef"
)の前にスラッシュを追加します。
上記のどちらも"\n"
、実際の改行ASCII制御文字に置き換えるのではなく、"\n"
2つのリテラル文字として残されます。これにより、JSONは改行エスケープとして解釈できます。
プロパティ値を文字列の配列として書き込みます。ここで与えられた例のようにhttps://gun.io/blog/multi-line-strings-in-json/。これは役立ちます。
以下のような複数行の文字列には、常に文字列の配列を使用できます。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
また、配列を簡単に反復して、コンテンツを複数行で表示できます。
json5(ローダー)を使用https://json5.org/を参照-例(json5による)
{
lineBreaks: "Look, Mom! \
No \\n's!",
}
JSONに複数行の文字列を含めることはできますか?
はい。F12キーを押し、コンソールをクリックして、画面の下部に入力して、Firefox Webブラウザーでこれをテストしました。
x={text:"hello\nworld"}
オブジェクトxは、複数行の文字列を含むJSON形式の文字列から作成されました。
console.log(x.text)
hello
world
x.textが表示され、複数行の文字列であることを示します。
これら2つのテストは、FirefoxのJavaScriptインタープリターが複数行の文字列でJSONを作成して使用できることを示しています。
Javascriptインタープリターを使用したテストをさらに行ってJSON.stringify
、JSON.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文字しか格納されません。
x={"a":NaN}
とx={"a":"a \<literal newline with SHIFT>b"}
、JSONされていないが、JavaScriptがある
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'))"`
base64
エンコードされた文字列値を使用してみてください。ほとんどの場合私のために働いた。
{
"singleLine": "Some singleline String",
"multiline": ["Line one", "line Two", "Line Three"]
}
後base64
のようにエンコードされた文字列の外観
{
"singleLine": "Some singleline String",
"multiline": "TGluZSBvbmUKTGluZSBUd28KTGluZSBUaHJlZQ=="
}
base64エンコードおよびデコードは、すべての言語で使用できます。
複数行のテキストをtxtファイルに入れてから
var str = {
text: cat('path_to_file/text.txt')
}
(mongoDBで動作します)
cat
。