Chuỗi nhiều dòng trong JSON


656

Tôi đang viết một số tệp dữ liệu ở định dạng JSON và muốn có một số giá trị chuỗi thực sự dài được chia thành nhiều dòng. Sử dụng mô-đun JSON của python Tôi nhận được rất nhiều lỗi, cho dù tôi sử dụng \hay \nlà một lối thoát.

Có thể có các chuỗi nhiều dòng trong JSON không? Chủ yếu là để thoải mái về mặt hình ảnh nên tôi cho rằng tôi có thể bật tính năng ngắt từ trong trình chỉnh sửa của mình, nhưng tôi chỉ tò mò thôi ...



1
cấu trúc dữ liệu của bạn: chia chuỗi multiline thành một chuỗi các chuỗi, sau đó nối chúng lại sau.
RubyTuesdayDONO

2
Hãy thử công cụ hjson. Nó sẽ chuyển đổi chuỗi multiline của bạn trong json sang định dạng json thích hợp.
gaurav

Bản sao có thể có
Flimzy

Câu trả lời:


403

JSON không cho phép ngắt dòng thực. Bạn cần phải thay thế tất cả các ngắt dòng với \n.

ví dụ:

"first line second line"

có thể lưu với:

"first line\nsecond line"

Ghi chú:

cho Python, điều này nên được viết là:

"first line\\nsecond line"

nơi \\để thoát khỏi dấu gạch chéo ngược, nếu không, python sẽ coi \nlà ký tự điều khiển "dòng mới"


89
-1 OP đang sử dụng chuỗi thoát "\ n". Nó không hoạt động vì chúng không thoát khỏi dấu gạch chéo ngược , như "\\ n", vì vậy Python đang chuyển đổi chuỗi thoát thành ký tự dòng mới thay vì để nó như một dấu gạch chéo ngược theo sau bởi en, như JSON yêu cầu.
dùng359996

6
@ user359996 Tôi không chắc đó là sự thật. Đối với tôi (lưu trữ dữ liệu trong JSON chỉ \nvà xuất dữ liệu qua Curses), \ncó vẻ hoạt động tốt. Nó phụ thuộc vào công cụ xem / kết xuất, có vẻ như.
tro999

2
Trình tự dòng mới thực sự là nền tảng cụ thể (xem en.wikipedia.org/wiki/Newline#Repftimeations ). Tuy nhiên, theo các cuộc đua @Lightness trong câu trả lời của Orbit, không phải các ký tự trả về con trỏ cũng như nguồn cấp dữ liệu trong ngữ pháp JSON. Tôi thực sự không phải là một lập trình viên Python, vì vậy tôi không chắc những gì đang xảy ra trong trường hợp của bạn, nhưng trình phân tích cú pháp của bạn bị hỏng hoặc bạn không vượt qua nó như những gì bạn nghĩ. Có lẽ câu trả lời này giải thích nó tốt hơn: stackoverflow.com/a/9295597/359996 . Lưu ý đặc biệt là bit về thoát kép.
dùng359996

5
@Nawaz: "\ n" và "\ r" lần lượt là các chuỗi thoát cho việc trả lại dòng và vận chuyển. Chúng không phải là các ký tự điều khiển dòng và trả lại theo nghĩa đen . Như một ví dụ bổ sung để làm cho nó rõ ràng hơn, hãy xem xét rằng "\\" là một chuỗi thoát cho dấu gạch chéo ngược, trái ngược với dấu gạch chéo ngược theo nghĩa đen. Ngữ pháp JSON loại trừ rõ ràng các ký tự điều khiển (xem định nghĩa "char") và thay vào đó cung cấp cho biểu diễn của chúng thông qua các chuỗi thoát (\\, \ r, \ n, v.v.).
dùng359996

2
@ user359996: Có .. Tôi đã thấy điều đó sau này, mặc dù tôi vẫn giữ bình luận cũ của mình như vậy, trong trường hợp bất kỳ ai khác đưa ra nghi ngờ tương tự, cuộc thảo luận của chúng tôi có thể giúp họ. cảm ơn vì đã xác nhận nó BTW.
Nawaz

197

Tôi đã phải làm điều này cho một dự án Node.js nhỏ và phát hiện này làm việc xung quanh :

{
 "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>"

 ],
}

Điều này có vẻ khá gọn gàng với tôi, từ đó tôi phải sử dụng dấu ngoặc kép ở mọi nơi. Mặc dù khác, tôi có thể, có thể, sử dụng YAML, nhưng điều đó có những cạm bẫy khác và không được hỗ trợ nguyên bản. Sau khi phân tích cú pháp, tôi chỉ sử dụng myData.modify_head.join('\n')hoặc myData.modify_head.join()tùy thuộc vào việc tôi có muốn ngắt dòng sau mỗi chuỗi hay không.


40
Đây là một giải pháp cho một cài đặt cụ thể, không nhất thiết liên quan đến câu hỏi. Những gì bạn tạo ra không phải là các chuỗi đa dòng (dù sao điều này là không thể), nhưng các mảng có các chuỗi bên trong
Samuel Rivas

3
Điều này cho thấy làm thế nào để chèn dòng mới trong chuỗi, mà KHÔNG trả lời câu hỏi. Câu trả lời này không.
fgrieu 16/07/2015

1
fgrieu - người ta có thể dễ dàng nối các chuỗi mà không cần thêm một dòng mới. Với sự thay đổi nhỏ đó, nó cung cấp một cách giải quyết cho các chuỗi đa dòng (miễn là bạn đang kiểm soát việc chỉ định lược đồ JSON). Tôi sẽ cố gắng cải thiện câu trả lời với điều này.
drrob

1
Cảm ơn, tôi thích điều này. Tôi đang làm điều này cho những gì tôi đang làm việc. Nó trông gọn gàng và có tổ chức. Tôi sẽ có mỗi dòng mới trong mảng này ngụ ý ngắt dòng trong văn bản xuất ra, mặc dù giải pháp này cũng có thể hoạt động trong trường hợp bạn không chèn ngắt dòng. Tôi đã sử dụng giải pháp này trước đây trong mã nguồn javascript của mình chỉ vì tôi thích cách tổ chức của nó và cách nó không để lại bất kỳ nghi ngờ nào về loại khoảng trắng nào được đưa vào chuỗi cuối cùng.
Gal

Mặc dù có sự bảo lưu của nhà phát minh JSON, tôi chỉ sử dụng điều này để thêm nhận xét (không có phần javascript, mà chỉ có [] và dấu phẩy) để thêm nhận xét để giúp người bảo trì trong tương lai có thể chỉnh sửa tệp JSON nhỏ của tôi.
Whirl Mind

117

Thật không may, nhiều câu trả lời ở đây giải quyết câu hỏi về cách đặt một ký tự dòng mới trong dữ liệu chuỗi. Câu hỏi là làm thế nào để làm cho mã trông đẹp hơn bằng cách chia giá trị chuỗi trên nhiều dòng mã. (Và ngay cả các câu trả lời nhận ra điều này cung cấp "giải pháp" cho rằng người ta có thể tự do thay đổi biểu diễn dữ liệu, trong nhiều trường hợp, người ta không thể.)

Và tin xấu hơn là, không có câu trả lời tốt.

Trong nhiều ngôn ngữ lập trình, ngay cả khi chúng không hỗ trợ rõ ràng việc phân tách các chuỗi trên các dòng, bạn vẫn có thể sử dụng nối chuỗi để có được hiệu quả mong muốn; và miễn là trình biên dịch không tệ, điều này là tốt.

Nhưng json không phải là ngôn ngữ lập trình; nó chỉ là một đại diện dữ liệu. Bạn không thể bảo nó nối chuỗi. Ngữ pháp (khá nhỏ) của nó cũng không bao gồm bất kỳ cơ sở nào để biểu diễn một chuỗi trên nhiều dòng.

Nói ngắn gọn về việc xử lý một loại tiền xử lý nào đó (và tôi, đối với một người, không cảm thấy muốn tạo ra ngôn ngữ của riêng mình để giải quyết vấn đề này một cách hiệu quả), không có giải pháp chung cho vấn đề này. NẾU bạn có thể thay đổi định dạng dữ liệu, sau đó bạn có thể thay thế một chuỗi các chuỗi. Mặt khác, đây là một trong nhiều cách mà json không được thiết kế cho khả năng đọc của con người.


3
Không rõ OP muốn gì, dòng mới trong chuỗi hoặc tổ chức chuỗi tốt hơn ...
9ilsdx 9rvj 0lo

3
@ 9ilsdx9rvj0lo: Không, không phải vậy.
Mark Adelsberger

Về "Câu hỏi là làm thế nào để làm cho mã trông đẹp hơn bằng cách chia giá trị chuỗi trên nhiều dòng mã ...": để biết giải pháp cho các câu lệnh nhiều dòng trong Python, hãy xem stackoverflow.com/questions/53162/ . Có một sự khác biệt giữa JSON đa dòng và Python đa dòng. JSON nhiều dòng sử dụng '\' theo sau là 'n' trong JSON, tức là "\ n" trong chuỗi. Các câu lệnh Python nhiều dòng, sử dụng '\' theo sau là '\ n', nghĩa là một dấu gạch chéo ngược trên dòng sẽ được tiếp tục. Định dạng Windows: thay thế \ n bằng \ r \ n khi thích hợp!
Ivan

106

Kiểm tra các đặc điểm kỹ thuật ! Quá trình sản xuất char của ngữ pháp JSON có thể nhận các giá trị sau:

  • bất kỳ-Unicode-ký tự-ngoại trừ- -or- "-or \-control-character
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u bốn chữ số

Dòng mới là "ký tự điều khiển" vì vậy, không, bạn có thể không có dòng mới theo nghĩa đen trong chuỗi của mình. Tuy nhiên, bạn có thể mã hóa nó bằng bất kỳ kết hợp nào \n\rbạn yêu cầu.



3
Đây là câu trả lời đúng vì nó không để lại sự mơ hồ. Các dòng mới được cho phép, theo đặc điểm kỹ thuật, miễn là chúng được thoát đúng với ký tự điều khiển.
Ryan

@AliKhaki \ n trong JSON sẽ không hoàn thành kết quả mà câu hỏi tìm kiếm. Hoặc bạn đang nghĩ về một cái gì đó khác (tức là nhúng các ký tự dòng mới) hoặc bạn đang nói về một dòng mới trong một chuỗi ký tự (chứa JSON) trong một số ngôn ngữ lập trình, một lần nữa lại là một thứ khác.
Các cuộc đua nhẹ nhàng trong quỹ đạo

@LightnessRacesinOrbit vâng tôi đang tìm kiếm dòng mới trong chuỗi
Ali Khaki

46

JSON không cho phép ngắt dòng để dễ đọc.

Đặt cược tốt nhất của bạn là sử dụng một IDE sẽ bao bọc cho bạn.


1
Một trình soạn thảo như BBEdit hỗ trợ gói dòng "mềm" là lý tưởng. Nó bao bọc văn bản để tất cả xuất hiện trong vùng hiển thị của cửa sổ soạn thảo, nhưng chỉ các kết thúc dòng mà bạn nhập (ví dụ: nhấn trở lại vận chuyển) được duy trì trong tệp khi nó được lưu. Làm cho nó dễ dàng hơn để chỉnh sửa JSON với các chuỗi thực sự dài mà không cần phải dùng đến các thủ thuật mã hoặc hack.
csh Bông

44

Đây là một câu hỏi thực sự cũ, nhưng tôi đã tìm thấy nó trên một tìm kiếm và tôi nghĩ rằng tôi biết nguồn gốc của vấn đề của bạn.

JSON không cho phép các dòng mới "thực" trong dữ liệu của nó; nó chỉ có thể thoát khỏi dòng mới. Xem câu trả lời từ @YOU . Theo câu hỏi, có vẻ như bạn đã cố thoát khỏi ngắt dòng trong Python theo hai cách: bằng cách sử dụng ký tự tiếp tục dòng ( "\") hoặc bằng cách sử dụng "\n"như một lối thoát.

Nhưng hãy nhớ rằng: nếu bạn đang sử dụng một chuỗi trong python, các ký tự thoát đặc biệt ( "\t", "\n") được dịch thành các ký tự điều khiển REAL! Nó "\n"sẽ được thay thế bằng ký tự điều khiển ASCII đại diện cho một ký tự dòng mới, chính xác là ký tự không hợp lệ trong JSON. (Đối với ký tự tiếp tục dòng, nó chỉ đơn giản là đưa dòng mới ra.)

Vì vậy, những gì bạn cần làm là để ngăn Python thoát khỏi các ký tự. Bạn có thể làm điều này bằng cách sử dụng một chuỗi thô (đặt rtrước chuỗi, như trong r"abc\ndef"hoặc bằng cách thêm một dấu gạch chéo phía trước dòng mới ( "abc\\ndef").

Cả hai ý chí trên, thay vì thay thế "\n"bằng ký tự điều khiển ASCII dòng mới thực sự, sẽ để lại "\n"dưới dạng hai ký tự theo nghĩa đen, sau đó JSON có thể hiểu là một lối thoát mới.


12

Viết giá trị thuộc tính dưới dạng một chuỗi các chuỗi. Ví dụ như được đưa ra ở đây https://gun.io/blog/multi-line-strings-in-json/ . Điều này sẽ giúp.

Chúng ta luôn có thể sử dụng mảng các chuỗi cho các chuỗi nhiều dòng như sau.

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

Và chúng ta có thể dễ dàng lặp lại mảng để hiển thị nội dung theo kiểu nhiều dòng.


1
Tôi muốn đề nghị bạn thêm thông tin trong câu trả lời của bạn từ liên kết, bởi vì các liên kết có thể bị hỏng trong tương lai.
YoungHobbit

5
Nhưng họ có một mảng, không phải là một chuỗi. Một mảng không phải là một chuỗi. Giai đoạn = Stage.
9ilsdx 9rvj 0lo

Chỉ nghĩ về điều này. Đẹp!
Phillip Jacobs

12

Sử dụng json5 (trình tải) xem https://json5.org/ - ví dụ (bởi json5)

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

Câu hỏi mà OP đặt ra. Ít nhất nếu anh ta có thể sử dụng json5.
Tên của

10

Có thể có các chuỗi nhiều dòng trong JSON không?

Đúng. Tôi vừa mới thử nghiệm điều này với trình duyệt web Firefox của mình bằng cách nhấn F12, nhấp vào bảng điều khiển và gõ ở dưới cùng của màn hình.

x={text:"hello\nworld"}

Đối tượng x vừa được tạo từ chuỗi định dạng JSON chứa chuỗi nhiều dòng.

console.log(x.text)
hello
world

x.text được hiển thị cho thấy rằng đó là một chuỗi nhiều dòng.

Hai thử nghiệm này cho thấy trình thông dịch Javascript của Firefox rất vui khi tạo và sử dụng JSON với các chuỗi nhiều dòng.

Nhiều thử nghiệm hơn với JSON.stringifyJSON.parsecho thấy trình thông dịch Javascript có thể chuyển đổi một đối tượng chứa các chuỗi đa dòng thành JSON và phân tích lại nó mà không gặp vấn đề gì.

Trước đây tôi đã lưu trữ các tác phẩm hoàn chỉnh của Shakespeare như một tài sản trong một đối tượng JSON và sau đó gửi nó qua internet, không được sửa chữa.

Thí dụ

Đây là một chuỗi hai dòng được nhập trên ba dòng

x={text:"expert\
s\nex\
change"}

Chúng ta có thể hiển thị đối tượng

console.log(x)

cho

Object { text: "experts\nexchange" }

hoặc chuỗi

console.log(x.text)

cho

experts
exchange

Kết thúc các dòng trong chuỗi kết quả từ việc sử dụng \ n và nhiều dòng đầu vào đạt được bằng cách chỉ \ ở cuối dòng.

Trong thực tế, bạn có thể muốn đồng bộ hóa các kết thúc dòng của mình với các kết thúc trong chuỗi, ví dụ:

x={text:"experts\n\
exchange"}

Độ dài chuỗi nhiều dòng

console.log("Hello\nWorld".length)
11 
console.log("Hello World".length)
11

Lưu ý rằng chuỗi có dòng mới không dài hơn chuỗi có khoảng trắng. Mặc dù hai ký tự được gõ trên bàn phím ('\' và 'n'), chỉ có một ký tự được lưu trong chuỗi.


3
Trình đọc định dạng chuỗi JavaScript không phải là trình đọc định dạng chuỗi JSON và ngược lại, do đó, trong khi nó hoạt động, bảng điều khiển JavaScript cũng chấp nhận x={"a":NaN}x={"a":"a \<literal newline with SHIFT>b"}, không phải là JSON, nhưng là JavaScript
cat

9

Sử dụng regex để thay thế tất cả các lần xuất hiện \r\nvới \\n.

Điều này làm việc cho tôi trong scala.

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

Tại sao 3 dấu gạch chéo ngược?
neXus

6
@neXus Tôi không biết tại sao nhưng ai đó đã chỉnh sửa nó thành 3 dấu gạch chéo ngược. Cảm ơn LightnessRacesInOrbit đã sửa nó.
Sikander

5

Nếu bạn sẵn sàng sử dụng Node.js, bạn có thể làm điều này:

module.exports = {

  multilineStr: `

     dis my life 
     it's now or never

  `

}

bạn có thể nhập bằng Node.js và chuyển đổi nó thành JSON dễ dàng như vậy:

echo `node -pe 'JSON.stringify(require("./json-mod.js"))'`

và bạn nhận được:

{"multilineStr":"\n \n dis my life\n it's now or never\n \n "}

Cách thức hoạt động : bạn sử dụng Node.js để tải mô-đun JS, tạo ra một đối tượng JS có thể dễ dàng được JSON xâu chuỗi bởi Node.js. Tùy chọn -e đánh giá chuỗi và -ptùy chọn lặp lại kết quả trả về của hoạt động Node.js cuối cùng cho thiết bị xuất chuẩn.

Nếu bạn muốn tải tập lệnh .js trong một thư mục làm việc khác, bạn phải chuyển chuỗi "" và '':

my_script='../json-mod.js'
echo `node -pe "JSON.stringify(require('$my_script'))"`

-4

Hãy thử sử dụng base64giá trị chuỗi được mã hóa. Làm việc cho tôi hầu hết thời gian.

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

sau khi base64chuỗi được mã hóa trông như

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

mã hóa và giải mã cơ sở64 có sẵn trong tất cả các ngôn ngữ.


7
Bạn cần mã đặc biệt để hiển thị nó, bạn đang chuyển đổi một chuỗi thành một mảng. Nó không phải là một giải pháp
tom10271

3
Tôi nghĩ rằng đây là một ý tưởng tồi - nó làm mờ nội dung một cách không cần thiết và đòi hỏi thêm mã, thời gian, bộ nhớ và công cụ để sản xuất và tiêu thụ nó. Tất nhiên, quét qua chuỗi và thay thế các ký tự đặc biệt cũng cần thêm mã, thời gian và bộ nhớ, nhưng chắc chắn ít hơn mã hóa và giải mã cơ
sở64

Đây là một ý tưởng tồi vì khả năng đọc của JSON không còn nữa và cũng như @ tom10271 đã đề cập, bạn cần thêm thao tác để sử dụng json
T90

-23

Đặt văn bản đa dòng trên tệp txt và sau đó

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

(nó hoạt động trên mongoDB)


11
-1: đây là một câu trả lời sai lệch. Nó không phải là JSON hợp lệ và cũng không hoạt động trong javascript vì không có hàm nào được đặt tên cat.
Martin Schuhfuß
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.