Giá trị JSON có thể chứa một chuỗi nhiều dòng không


114

Tôi đang viết một tệp JSON sẽ được đọc bởi một chương trình Java. Đoạn này như sau ...

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble.
                  so i would like to write it in multiple lines.
                  but, i do NOT require any new lines in the output.
                  I need to split the string value in this input file only.
                  such that I don't require to slide the horizontal scroll again and again while verifying the correctness of the statements.
                  the prev line, I have shown, without splitting just to give a feel of my problem"
    }
  }
}


17
Tôi nghĩ rằng điều này là về khả năng đọc của tệp JSON được tuần tự hóa chứ không phải về dấu ngắt dòng trong dữ liệu được tải (do đó, không phải là bản sao của chuỗi Multiline trong JSON ). Hãy nghĩ về nó giống như việc sử dụng JSON như một tệp cấu hình trong đó bạn có một chuỗi dài và để dễ đọc, sẽ rất hữu ích khi quấn cứng chuỗi trong trường hợp ai đó đang chỉnh sửa nó qua trình soạn thảo văn bản.
zashu

2
@zashu: Hầu hết các trình soạn thảo văn bản đều có chức năng soft-wrap. Điều đó ngay lập tức hữu ích hơn một số chiều rộng dòng mã hóa cứng.
Các cuộc đua ánh sáng trong quỹ đạo

4
@LightnessRacesinOrbit chạy git diffs (hoặc giải quyết xung đột hợp nhất) trên các tệp có dòng dài như vậy cũng là một điều khó khăn.
Hubert Kario

1
Đây là bản dupe của chuỗi Multiline trong JSON, trích dẫn câu hỏi của OP: " Có thể có chuỗi nhiều dòng trong JSON không? Nó chủ yếu để tạo sự 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 bọc từ trong trình chỉnh sửa của mình, nhưng tôi Tôi chỉ hơi tò mò ... "
Andre Figueedlyo

Câu trả lời:


61

Kiểm tra các thông số kỹ thuật ! Việc 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ự-except- "-hoặc- \-Hoặc kiểm soát ký tự
  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u bốn chữ số hex

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ỳ sự kết hợp nào \n\rbạn yêu cầu.

Công cụ JSONLint xác nhận rằng JSON của bạn không hợp lệ.


Cập nhật: Và nếu bạn muốn viết dòng mới bên trong cú pháp JSON của mình mà không thực sự đưa dòng mới vào dữ liệu, thì bạn thậm chí còn gặp may gấp đôi. Mặc dù JSON được thiết kế để thân thiện với con người ở một mức độ nào đó, nhưng nó vẫn là dữ liệu và bạn đang cố gắng áp dụng định dạng tùy ý cho dữ liệu đó. Đó hoàn toàn không phải là những gì JSON nói về.


32

Tôi không chắc về yêu cầu chính xác của bạn nhưng một giải pháp khả thi để cải thiện 'khả năng đọc' là lưu trữ nó dưới dạng một mảng.

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : ["this is a very long line which is not easily readble.",
                  "so i would like to write it in multiple lines.",
                  "but, i do NOT require any new lines in the output."]
    }
  }
}

}

Tham gia lại bất cứ khi nào được yêu cầu với

result.join(" ")

13
Điều đó thật khó hiểu. Đó là một rò rỉ trừu tượng. Tôi sẽ coi một định dạng dữ liệu được chỉ định theo cách này, về cơ bản là bị hỏng.
Các cuộc đua ánh sáng trong quỹ đạo

4
Tôi không thể tưởng tượng việc thiết kế một tài liệu API hoặc JSON theo cách này chỉ để tăng khả năng đọc chuỗi (chỉ vì lý do gỡ lỗi mà tôi đoán): | ....
Adam Dyga

"Tôi sẽ coi một định dạng dữ liệu được chỉ định theo cách này, về cơ bản là bị hỏng." Tuy nhiên, hãy cân nhắc rằng đây là trường hợp thử nghiệm. Nếu bạn muốn mã hóa chuỗi cứng, bạn có thể muốn một tệp thuộc tính. Cá nhân tôi sẽ không lưu trữ dữ liệu "thực" trong JSON trong các trường hợp bình thường. Nhưng nếu đây là một cách đơn giản để đi từ không có bài kiểm tra đến bài kiểm tra, thì hãy tiếp tục.
sf_jeff,

@AdamDyga trên thực tế, nó có thể hữu ích để lưu trữ các tệp json vào một CVS, trong đó đơn vị là delta là dòng.
yota

7

Không phải là giải pháp tốt, nhưng bạn có thể thử công cụ hjson . Liên kết . Nó cho phép bạn viết văn bản nhiều dòng trong trình soạn thảo và sau đó chuyển đổi nó sang định dạng JSON hợp lệ thích hợp. Lưu ý: nó thêm ký tự '\ n' cho các dòng mới, nhưng bạn có thể chỉ cần xóa chúng trong bất kỳ trình soạn thảo văn bản nào bằng chức năng "Thay thế tất cả ..".

PS Nên là một bình luận cho câu hỏi, nhưng không có đủ repo, xin lỗi.


Đó thực sự là một ý tưởng hay. Phiên bản kiểm soát Hjson và chuyển nó sang JSON nếu cần.
Các cuộc đua ánh sáng trong quỹ đạo

3

Như tôi có thể hiểu, câu hỏi không phải là về cách truyền một chuỗi với các ký hiệu điều khiển bằng cách sử dụng jsonmà là cách lưu trữ và khôi phục json trong tệp nơi bạn có thể chia một chuỗi bằng các ký hiệu điều khiển trình soạn thảo.

Nếu bạn muốn lưu trữ chuỗi nhiều dòng trong một tệp thì tệp của bạn sẽ không lưu trữ jsonđối tượng hợp lệ . Nhưng nếu bạn chỉ sử dụng các jsontệp của mình trong chương trình của mình, thì bạn có thể lưu trữ dữ liệu như bạn muốn và xóa tất cả các dòng mới khỏi tệp theo cách thủ công mỗi khi bạn tải nó vào chương trình của mình và sau đó chuyển đến trình phân tích cú pháp json.

Hoặc, cách khác, sẽ tốt hơn, bạn có thể có jsoncác tệp nguồn dữ liệu của mình , nơi bạn chỉnh sửa một phần tùy ý và sau đó xóa tất cả các dòng mới bằng một số tiện ích vào jsontệp hợp lệ mà chương trình của bạn sẽ sử dụng.


2

Tôi tin rằng nó phụ thuộc vào trình thông dịch json bạn đang sử dụng ... trong javascript thuần túy, bạn có thể sử dụng trình kết thúc dòng

{
  "testCases" :
  {
    "case.1" :
    {
      "scenario" : "this the case 1.",
      "result" : "this is a very long line which is not easily readble. \
                  so i would like to write it in multiple lines. \
                  but, i do NOT require any new lines in the output."
    }
  }
}

Điều này đúng, nhưng khoảng cách thụt lề sẽ xuất ra: a\ c=> a c.
Andre Figuentico

1
JavaScript không có "trình thông dịch JSON" chấp nhận điều này. Nó chỉ có thể lấy JSON trong một chuỗi. Đúng, nếu bạn đã cung cấp JSON bên trong một chuỗi ký tự thì bạn có thể thực hiện cách tiếp cận này, nhưng đó là một điều bất thường. Bạn có đang nhầm lẫn giữa JSON với các khai báo đối tượng thực tế trong JavaScript không?
Các cuộc đua ánh sáng trong quỹ đạo
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.