JSON に複数行の文字列を含めることは可能ですか?
これは主に視覚的な快適さのためなので、エディターでワードラップをオンにできると思いますが、ちょっと興味があります.
いくつかのデータ ファイルを JSON 形式で書いていますが、非常に長い文字列値を複数行に分割したいと考えています。python の JSON モジュールを使用すると、使用する\
か\n
エスケープとして使用するかに関係なく、大量のエラーが発生します。
JSONでは実際の改行は許可されていません。すべての改行を に置き換える必要があります\n
。
例えば:
"first line
second line"
次の方法で保存できます:
"first line\nsecond line"
ノート:
の場合Python
、これは次のように記述します。
"first line\\nsecond line"
は\\
バックスラッシュをエスケープするためのものです。それ以外の場合、python は\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>"
],
}
解析したら、各文字列の後に改行が必要かどうかに応じて、myData.modify_head.join('\n')
orを使用します。myData.modify_head.join()
これは、どこでも二重引用符を使用する必要があることを除けば、私には非常にきれいに見えます。それ以外の場合は、おそらく YAML を使用できますが、これには別の落とし穴があり、ネイティブでサポートされていません。
仕様をチェック!JSON 文法のchar生成は、次の値を取ることができます。
"
-or -or-or-control-character を除く任意の Unicode\
文字\"
\\
\/
\b
\f
\n
\r
\t
\u
16 進数 4 桁改行は「制御文字」であるため、文字列内に文字通りの改行がない場合があります。\n
ただし、必要なとの任意の組み合わせを使用してエンコード\r
できます。
これは本当に古い質問ですが、検索でこれに出くわし、あなたの問題の原因を知っていると思います。
JSONは、データに「実際の」改行を許可しません。改行をエスケープすることしかできませんでした。@YOUからの回答を参照してください。質問によると、Pythonで2つの方法で改行をエスケープしようとしたようです。行継続文字()を使用するか、エスケープとして使用します。"\"
"\n"
ただし、Pythonで文字列を使用している場合は、特殊なエスケープ文字("\t"
、"\n"
)が実際の制御文字に変換されることに注意してください。は"\n"
、改行文字を表すASCII制御文字に置き換えられます。これは、JSONでは不正な文字です。(行継続文字は、改行を抜くだけです。)
したがって、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"]
}
また、配列を簡単に繰り返してコンテンツを複数行で表示できます。
クライアント側でエンコードし、サーバー側でデコードできます。これにより、\n および \t 文字も処理されます
たとえば、json を介して複数行の xml を送信する必要がありました
{
"xml": "PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+CiAgPFN0cnVjdHVyZXM+CiAgICAgICA8aW5wdXRzPgogICAgICAgICAgICAgICAjIFRoaXMgcHJvZ3JhbSBhZGRzIHR3byBudW1iZXJzCgogICAgICAgICAgICAgICBudW0xID0gMS41CiAgICAgICAgICAgICAgIG51bTIgPSA2LjMKCiAgICAgICAgICAgICAgICMgQWRkIHR3byBudW1iZXJzCiAgICAgICAgICAgICAgIHN1bSA9IG51bTEgKyBudW0yCgogICAgICAgICAgICAgICAjIERpc3BsYXkgdGhlIHN1bQogICAgICAgICAgICAgICBwcmludCgnVGhlIHN1bSBvZiB7MH0gYW5kIHsxfSBpcyB7Mn0nLmZvcm1hdChudW0xLCBudW0yLCBzdW0pKQogICAgICAgPC9pbnB1dHM+CiAgPC9TdHJ1Y3R1cmVzPg=="
}
次に、サーバー側でデコードします
public class XMLInput
{
public string xml { get; set; }
public string DecodeBase64()
{
var valueBytes = System.Convert.FromBase64String(this.xml);
return Encoding.UTF8.GetString(valueBytes);
}
}
public async Task<string> PublishXMLAsync([FromBody] XMLInput xmlInput)
{
string data = xmlInput.DecodeBase64();
}
デコードすると、元のxmlが取得されます
<?xml version="1.0" encoding="utf-8" ?>
<Structures>
<inputs>
# This program adds two numbers
num1 = 1.5
num2 = 6.3
# Add two numbers
sum = num1 + num2
# Display the sum
print('The sum of {0} and {1} is {2}'.format(num1, num2, sum))
</inputs>
</Structures>