880

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

これは主に視覚的な快適さのためなので、エディターでワードラップをオンにできると思いますが、ちょっと興味があります.

いくつかのデータ ファイルを JSON 形式で書いていますが、非常に長い文字列値を複数行に分割したいと考えています。python の JSON モジュールを使用すると、使用する\\nエスケープとして使用するかに関係なく、大量のエラーが発生します。

4

11 に答える 11

538

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

例えば:

"first line second line"

次の方法で保存できます:

"first line\nsecond line"

ノート:

の場合Python、これは次のように記述します。

"first line\\nsecond line"

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

于 2010-03-06T15:04:26.923 に答える
230

小さな 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 を使用できますが、これには別の落とし穴があり、ネイティブでサポートされていません。

于 2011-10-12T18:21:48.133 に答える
126

仕様をチェック!JSON 文法のchar生成は、次の値を取ることができます。

  • "-or -or-or-control-character を除く任意の Unicode\文字
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u 16 進数 4 桁

改行は「制御文字」であるため、文字列内に文字通りの改行がない場合があります。\nただし、必要なとの任意の組み合わせを使用してエンコード\rできます。

于 2013-05-22T11:10:18.573 に答える
51

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

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

ただし、Pythonで文字列を使用している場合は、特殊なエスケープ文字("\t""\n")が実際の制御文字に変換されることに注意してください。は"\n"、改行文字を表すASCII制御文字に置き換えられます。これは、JSONでは不正な文字です。(行継続文字は、改行を抜くだけです。)

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

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

于 2013-01-17T18:54:01.977 に答える
19

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

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

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

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

于 2015-10-07T10:37:35.683 に答える
0

クライアント側でエンコードし、サーバー側でデコードできます。これにより、\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>
于 2021-10-26T09:37:02.037 に答える