Nhận xét có thể được sử dụng trong JSON không?


7610

Tôi có thể sử dụng các bình luận bên trong một tệp JSON không? Nếu vậy thì thế nào?


153
@StingyJack: Để giải thích những điều có thể không rõ ràng, hoặc bất cứ điều gì khác người ta có thể làm với các bình luận. Tôi cho một người thường có ý kiến ​​trong các tập tin dữ liệu. XML, các tệp ini và nhiều định dạng khác bao gồm các quy định cho nhận xét.
Michael Burr

24
Nếu bạn, giống như tôi, đang tự hỏi liệu //commentscó ổn đối với trường hợp sử dụng cụ thể của tệp cấu hình Sublime Text hay không, câu trả lời là có (kể từ phiên bản 2). Sublime Text sẽ không phàn nàn về điều đó, ít nhất, trong khi nó sẽ phàn nàn về {"__comment": ...}giao diện điều khiển, bởi vì đây là một lĩnh vực bất ngờ.
driftcatcher

8
và có lẽ đây là một lý do tại sao TOML được tạo ra ..
Alex Nolasco

10
Hơi noobish nhưng, tôi cũng đã thử sử dụng // cho các bình luận trong JSON. Bây giờ tôi nhận ra nó được sử dụng nghiêm ngặt để trao đổi / trao đổi. Thở dài! Tôi không thể bình luận gì thêm :(. Cuộc sống sẽ phải chịu số phận!
Sid

12
JSON5 hỗ trợ các bình luận: stackoverflow.com/a/7901053/108238
schoetbi 2/215

Câu trả lời:


5594

Không.

Tất cả JSON phải là dữ liệu và nếu bạn bao gồm một nhận xét thì nó cũng sẽ là dữ liệu.

Bạn có thể có một yếu tố dữ liệu được chỉ định gọi là "_comment"(hoặc một cái gì đó) sẽ bị bỏ qua bởi các ứng dụng sử dụng dữ liệu JSON.

Có lẽ bạn nên có nhận xét tốt hơn trong các quy trình tạo / nhận JSON, vì họ phải biết trước dữ liệu JSON sẽ là gì hoặc ít nhất là cấu trúc của nó.

Nhưng nếu bạn quyết định:

{
   "_comment": "comment text goes here...",
   "glossary": {
      "title": "example glossary",
      "GlossDiv": {
         "title": "S",
         "GlossList": {
            "GlossEntry": {
               "ID": "SGML",
               "SortAs": "SGML",
               "GlossTerm": "Standard Generalized Markup Language",
               "Acronym": "SGML",
               "Abbrev": "ISO 8879:1986",
               "GlossDef": {
                  "para": "A meta-markup language, used to create markup languages such as DocBook.",
                  "GlossSeeAlso": ["GML", "XML"]
               },
               "GlossSee": "markup"
            }
         }
      }
   }
}

232
Nó có thể trả tiền để có một số loại tiền tố trên nhận xét thực tế trong trường hợp có một trường hợp lệ có tên là bình luận:"__comment":"comment text goes here...",
Rob Fonseca-Ensor

19
BTW, thư viện json cho Java google-gson có hỗ trợ cho các bình luận.
centic

11
Điều gì về nếu tôi muốn một nhận xét riêng về AccronymAbbrevtài sản? Tôi đã sử dụng mô hình này trước đây nhưng đã dừng vì nó không cho phép tôi làm điều đó. Đây là một hack. Có lẽ nếu tôi đặt trước một tên tài sản __comment__thay thế. Đó là "__comment__ Aboustv", vẫn là một bản hack, nhưng sẽ để tôi nhận xét về tất cả các đề xuất
Juan Mendes

41
bạn cũng có thể sử dụng "//": cái này trông có vẻ bản địa hơn và vẫn có thể lặp lại trong cùng một cha mẹ
smnbbrv

4
Khi JSON được sử dụng cho các tệp cấu hình dành cho con người, chúng nên được chú thích để con người hiểu rõ hơn. Chú thích, tệp như vậy không còn hợp lệ JSON, nhưng có giải pháp. Ví dụ: GYP của Google hỗ trợ nhận xét kiểu #. JSON.Minify sẽ giúp bạn loại bỏ các nhận xét kiểu C / C ++ khỏi tệp đầu vào của bạn.
Петър Петров

1842

Không , nhận xét về biểu mẫu //…hoặc /*…*/không được phép trong JSON. Câu trả lời này dựa trên:

  • http://www.json.org
  • RFC 4627 : application/jsonLoại phương tiện cho ký hiệu đối tượng JavaScript (JSON)
  • RFC 8259 Định dạng trao đổi dữ liệu ký hiệu đối tượng JavaScript (JSON) (thay thế RFCs 4627, 7158, 7159)

67
Nếu bạn muốn chú thích JSON của bạn bằng các bình luận (do đó làm cho JSON không hợp lệ), thì hãy thu nhỏ nó trước khi phân tích hoặc truyền. Chính Crockford đã thừa nhận điều này vào năm 2012 trong bối cảnh các tập tin cấu hình.
cụ

25
@alkuzad: Khi nói đến ngữ pháp chính thức, phải có một cái gì đó nói rõ ràng rằng chúng được cho phép, không phải là cách khác. Ví dụ: chọn ngôn ngữ lập trình bạn chọn: Chỉ vì một số tính năng mong muốn (nhưng thiếu) không được phép rõ ràng, không có nghĩa là trình biên dịch của bạn sẽ nhận ra nó một cách kỳ diệu.
stakx - không còn đóng góp

5
Đúng. Định dạng JSON có nhiều khoảng trống giữa các thành phần và không nhạy cảm với không gian trong các khu vực đó, vì vậy không có lý do gì bạn không thể có các nhận xét đơn hoặc nhiều dòng ở đó. Nhiều trình phân tích cú pháp và trình khai thác cũng hỗ trợ các nhận xét JSON, vì vậy hãy đảm bảo rằng trình phân tích cú pháp của bạn hỗ trợ chúng. JSON được sử dụng rất nhiều cho các cài đặt cấu hình và dữ liệu ứng dụng, vì vậy hiện tại cần có các bình luận. "Thông số chính thức" là một ý tưởng hay, nhưng nó không đủ và lỗi thời, quá tệ. Giảm thiểu JSON của bạn nếu bạn quan tâm đến kích thước hoặc hiệu suất tải trọng.
Triynko

58
Mặc dù câu trả lời của bạn là hoàn toàn chính xác, cần phải nói rằng đây là BS. Với rất nhiều người dùng cuối xuất hiện nhu cầu cấu hình json, sau đó các bình luận cực kỳ hữu ích. Chỉ vì một số mũ gói bằng giấy thiếc quyết định rằng JSON phải luôn luôn là máy có thể đọc được, bất chấp sự thật rằng con người cần phải đọc nó đến, là IMHO là một trò hề của đầu óc nhỏ.
cmroanirgo

18
@cmroanirgo: Rõ ràng bạn không phải là người đầu tiên phàn nàn về giới hạn đó của JSON ... đó là lý do tại sao chúng tôi có các trình phân tích cú pháp âm thầm cho phép nhận xét và các định dạng khác như YAML và JSON5. Tuy nhiên, điều này không thay đổi thực tế rằng JSON là như vậy. Thay vào đó, tôi thấy thú vị khi mọi người bắt đầu sử dụng JSON cho các mục đích rõ ràng là không đủ ngay từ đầu, do giới hạn trong câu hỏi. Đừng đổ lỗi cho định dạng JSON; tự trách mình vì đã khăng khăng sử dụng nó khi nó không phù hợp lắm.
stakx - không còn đóng góp

802

Bao gồm ý kiến ​​nếu bạn chọn; loại bỏ chúng bằng một công cụ khai thác trước khi phân tích hoặc truyền.

Tôi vừa phát hành JSON.minify () để loại bỏ các bình luận và khoảng trắng từ một khối JSON và làm cho JSON hợp lệ có thể được phân tích cú pháp. Vì vậy, bạn có thể sử dụng nó như:

JSON.parse(JSON.minify(my_str));

Khi tôi phát hành nó, tôi đã nhận được một phản ứng dữ dội về việc mọi người không đồng ý với ý tưởng của nó, vì vậy tôi quyết định rằng tôi sẽ viết một bài đăng blog toàn diện về lý do tại sao các bình luận có ý nghĩa trong JSON . Nó bao gồm nhận xét đáng chú ý này từ người tạo JSON:

Giả sử bạn đang sử dụng JSON để giữ các tệp cấu hình mà bạn muốn chú thích. Đi trước và chèn tất cả các ý kiến ​​bạn thích. Sau đó chuyển nó qua JSMin trước khi đưa nó cho trình phân tích cú pháp JSON của bạn. - Douglas Crockford, 2012

Hy vọng rằng điều đó hữu ích cho những người không đồng ý với lý do tại sao JSON.minify () có thể hữu ích.


153
Vấn đề duy nhất tôi gặp phải với JSON.minify () là nó thực sự rất chậm. Vì vậy, tôi đã thực hiện việc thực hiện của riêng mình mà thực hiện điều tương tự: gist.github.com/1170297 . Trên một số tệp thử nghiệm lớn, quá trình thực hiện của bạn mất 74 giây và khai thác 0,06 giây.
WizKid

56
Sẽ thật tuyệt nếu bạn có thể gửi thuật toán thay thế được đề xuất cho repo github cho JSON.minify (), để nó có thể được chuyển đến tất cả các lang được hỗ trợ: github.com/getify/json.minify
Kyle Simpson

16
@MiniGod Tôi đã nghe suy nghĩ của Doug về chủ đề này nhiều lần. Tôi đã giải quyết chúng từ lâu trong bài đăng trên blog của mình: blog.getify.com/json-comments
Kyle Simpson

18
@ MarnenLaibow-Koser vẫn còn sử dụng hợp lệ cho các nhận xét ngay cả đối với việc sử dụng luồng dữ liệu (hoặc thậm chí gói): bao gồm siêu dữ liệu chẩn đoán như thời gian tạo hoặc nguồn cũng được sử dụng phổ biến với XML và cũng hoàn toàn hợp lý đối với dữ liệu JSON. Các lập luận chống lại các bình luận là nông cạn và bất kỳ định dạng dữ liệu văn bản nào cũng sẽ cho phép nhận xét, bất kể mục đích sử dụng ngụ ý (không có thông số nào cho thấy JSON không thể được sử dụng ở nơi khác, fwiw)
StaxMan

18
Nếu JSON là để có sự chấp nhận phổ quát (về cơ bản là như vậy) thì nó sẽ có ứng dụng phổ quát. Ví dụ: JSON có thể phục vụ như một tệp cấu hình ứng dụng. Ứng dụng này sẽ mong muốn ý kiến.
đánh trứng

441

Nhận xét đã bị xóa khỏi JSON theo thiết kế.

Tôi đã xóa các nhận xét khỏi JSON vì tôi thấy mọi người đang sử dụng chúng để giữ các chỉ thị phân tích cú pháp, một thực tế sẽ phá hủy khả năng tương tác. Tôi biết rằng việc thiếu bình luận làm cho một số người buồn, nhưng không nên.

Giả sử bạn đang sử dụng JSON để giữ các tệp cấu hình mà bạn muốn chú thích. Đi trước và chèn tất cả các ý kiến ​​bạn thích. Sau đó chuyển nó qua JSMin trước khi đưa nó cho trình phân tích cú pháp JSON của bạn.

Nguồn: Tuyên bố công khai của Douglas Crockford trên G +


198
Tôi nghĩ rằng JSON đáng lẽ phải dễ đọc hơn con người, nói, XML? Bình luận là để dễ đọc.
intrepidis

25
Dù sao, bạn có thể nghịch ngợm và thêm các lệnh phân tích cú pháp trong JSON: {"__directives": {"# n #": "DateTime.Now"}, "validdate": "# n #"} ... Có vẻ như YAML là con đường phía trước rồi ...
intrepidis

73
Ý kiến ​​cá nhân: không cho phép bình luận là khập khiễng. Tôi không có lựa chọn nào khác ngoài việc xây dựng một trình phân tích cú pháp JSON không chuẩn mà bỏ qua các bình luận, để giải mã các tệp cấu hình của tôi.
caiosm1005

17
@ArturCzajka Tôi vẫn không thích thực tế JSON không hỗ trợ các bình luận, nhưng tôi đã thử INI và tôi phải thừa nhận rằng việc sử dụng chúng trên JSON cho các tệp cấu hình sẽ có ý nghĩa hơn nhiều. Cảm ơn phản hồi và hy vọng nhiều người sẽ thay đổi suy nghĩ khi họ đọc cuộc trò chuyện này. (làm một trình phân tích cú pháp dù sao cũng là một bài tập hơn :)
caiosm1005

77
Điều đó giống như yêu cầu tất cả các xe đạp phải có bánh xe tập luyện vì một số người không thể đi xe đạp. Loại bỏ một tính năng quan trọng bởi vì những người ngu ngốc lạm dụng nó là thiết kế xấu. Một định dạng dữ liệu nên ưu tiên khả năng sử dụng hơn là bằng chứng ngu ngốc.
Phil Goetz

205

TUYÊN BỐ TỪ CHỐI: BẢO HÀNH CỦA BẠN LÀ VOID

Như đã được chỉ ra, hack này lợi dụng việc thực hiện thông số kỹ thuật. Không phải tất cả các trình phân tích cú pháp JSON sẽ hiểu loại JSON này. Trình phân tích cú pháp đặc biệt sẽ bị sặc.

Đó là một sự tò mò thú vị, nhưng bạn thực sự không nên sử dụng nó cho bất cứ điều gì cả . Dưới đây là câu trả lời ban đầu.


Tôi đã tìm thấy một hack nhỏ cho phép bạn đặt các bình luận trong một tệp JSON sẽ không ảnh hưởng đến việc phân tích cú pháp hoặc thay đổi dữ liệu được trình bày theo bất kỳ cách nào.

Có vẻ như khi khai báo một đối tượng bằng chữ, bạn có thể chỉ định hai giá trị có cùng khóa và giá trị cuối cùng được ưu tiên. Dù bạn có tin hay không, hóa ra các trình phân tích cú pháp JSON cũng hoạt động theo cùng một cách. Vì vậy, chúng ta có thể sử dụng điều này để tạo các bình luận trong JSON nguồn sẽ không có trong biểu diễn đối tượng được phân tích cú pháp.

({a: 1, a: 2});
// => Object {a: 2}
Object.keys(JSON.parse('{"a": 1, "a": 2}')).length; 
// => 1

Nếu chúng tôi áp dụng kỹ thuật này, tệp JSON được nhận xét của bạn có thể trông như thế này:

{
  "api_host" : "The hostname of your API server. You may also specify the port.",
  "api_host" : "hodorhodor.com",

  "retry_interval" : "The interval in seconds between retrying failed API calls",
  "retry_interval" : 10,

  "auth_token" : "The authentication token. It is available in your developer dashboard under 'Settings'",
  "auth_token" : "5ad0eb93697215bc0d48a7b69aa6fb8b",

  "favorite_numbers": "An array containing my all-time favorite numbers",
  "favorite_numbers": [19, 13, 53]
}

Đoạn mã trên là JSON hợp lệ . Nếu bạn phân tích cú pháp, bạn sẽ nhận được một đối tượng như thế này:

{
    "api_host": "hodorhodor.com",
    "retry_interval": 10,
    "auth_token": "5ad0eb93697215bc0d48a7b69aa6fb8b",
    "favorite_numbers": [19,13,53]
}

Điều đó có nghĩa là không có dấu vết của các bình luận, và chúng sẽ không có tác dụng phụ kỳ lạ.

Chúc mừng hack!


150
Từ đặc điểm kỹ thuật : Các tên trong một đối tượng NÊN là duy nhất.
Quentin

113
"Tất cả các triển khai đều xử lý như nhau" - Đó là một điều khó chứng minh.
Quentin

91
Thứ tự của các phần tử trong JSON không được đảm bảo. Điều đó có nghĩa là mục "cuối cùng" có thể thay đổi!
sep32

66
Điều này rõ ràng vi phạm thông số kỹ thuật (xem ý kiến ​​trên), không làm điều này. ietf.org/rfc/rfc4627.txt?number=4627
voidlogic

334
KHÔNG - nếu trình phân tích cú pháp phát trực tuyến thì sao? Điều gì xảy ra nếu trình phân tích cú pháp đọc nó vào một từ điển trong đó thứ tự khóa không được xác định? giết này với lửa .
deanWombourne

183

JSON không hỗ trợ bình luận. Nó cũng không bao giờ có ý định được sử dụng cho các tập tin cấu hình, nơi cần bình luận.

Hjson là một định dạng tập tin cấu hình cho con người. Cú pháp thư giãn, ít sai lầm hơn, bình luận nhiều hơn.

Giới thiệu Hjson

Xem hjson.org để biết các thư viện JavaScript, Java, Python, PHP, Rust, Go, Ruby và C #.


13
Nâng cao. Đó rõ ràng là một biến thể tốt những người bảo thủ không cởi mở sẽ chỉ thích ghét. Tôi hy vọng việc triển khai của bạn được biết đến nhiều hơn - và thậm chí có thể trở nên phổ biến hơn so với bản gốc;) Tôi hy vọng ai đó cũng sẽ thực hiện nó với Ruby. @adelphus Ngôn ngữ được xác định rõ là quan điểm hoặc quan điểm của riêng bạn. Trở thành một "nhà phát triển" bảo thủ nếu bạn là một người không chứng minh rằng bạn tốt hơn và thậm chí còn tệ hơn khi giữ bản thân bị nhốt trong không gian hạn chế. Đừng đánh giá mọi người là nhà phát triển khủng khiếp một cách dễ dàng.
konsolebox

7
Xin lỗi về điều đó, @konsolebox. Có lẽ bạn có thể xem xét lại quan điểm "JSON được xác định rõ là quan điểm của bạn" sau khi đọc ecma-i Intl.org/publications/files/ECMA-ST/ECMA-404.pdf Đây là một tiêu chuẩn thực sự và các nhà phát triển thực hiện các phiên bản "đặc biệt" của riêng họ dẫn đến sự phân mảnh, nhầm lẫn và rất nhiều thời gian lãng phí. Nhìn vào các nhà phát triển web lộn xộn còn sót lại khi viết mã chỉ vì mỗi trình duyệt thực hiện các phiên bản tiêu chuẩn hơi khác nhau. Ngôn ngữ JSON có thể không hoàn hảo, nhưng sự phân mảnh thì tệ hơn. Và vâng, đó chỉ là một ý kiến ​​và bạn có thể không đồng ý.
adelphus

22
Tôi ngưỡng mộ suy nghĩ của bạn, nhưng bạn đang phát minh lại YAML. Nếu bạn muốn có nhiều tính linh hoạt và khả năng đọc của con người, hãy sử dụng YAML (không thực sự: stackoverflow.com/questions/450399/ Ấn ) hoặc gắn bó với sự cộc lốc, nhưng không rõ ràng JSON.
cụ

4
Tôi thấy định dạng cấu hình thân thiện với người dùng nhất vẫn là INI. Nó đơn giản và không nặng cú pháp. Điều này làm cho nó ít đáng sợ hơn đối với người dùng chỉ cần nhúng ngón chân vào ao cấu hình.
Matt

14
Bất cứ khi nào bạn cần json như cấu hình (nơi nhận được cần thiết) - tên tập tin của bạn ".js" thay vì ".json" .. js thể của khóa học xử lý bất kỳ đối tượng json hợp lệ và bổ sung có thể giải quyết yêu cầu .. Đó là lý do tại sao nó lại "webpack.config.js" chứ không phải "webpack.config.json" (cũng có nhiều lý do khác cho điều đó trong webpack: P)
jebbie

122

Cân nhắc sử dụng YAML. Nó gần như là một superset của JSON (hầu như tất cả JSON hợp lệ là YAML hợp lệ) và nó cho phép nhận xét.


12
@ g33kz0r Đúng, do đó, mô tả của tôi về YAML như là một siêu thay thế của JSON.
Marnen Laibow-Koser

12
@NateS Nhiều người đã chỉ ra rằng câu trả lời là không. Tôi đã đề xuất một cách tốt hơn để đạt được mục tiêu của OP. Đó là một câu trả lời.
Marnen Laibow-Koser

5
Nhược điểm: yamlthư viện không được vận chuyển bằng Python.
Chảy máu ngón tay

6
@ marnen-laibow-koser: yup, việc sử dụng các thư viện YAML có sẵn cho Java và Perl là không đủ và hy vọng YAML do mỗi người khác sử dụng sẽ không bị lỗi. Sự can thiệp YAML đó là một vấn đề, nhưng interop JSON thì không, hoàn toàn được giải thích bởi sự thiếu hiểu biết của tôi.
cụ

3
@ marnen-laibow-koser, một định dạng hoàn thành điều tương tự với thông số đơn giản hơn sẽ tốt hơn. Một định dạng thực dụng với các triển khai hoàn hảo tốt hơn một định dạng lý tưởng với các triển khai không hoàn hảo. Không phải tất cả đổ lỗi cho libs bị lỗi nằm trên vai của người thực hiện; Thông số YAML dài, dày đặc và khó hiểu. Mục nhập Wikipedia của nó trích dẫn hai ví dụ về sự mơ hồ; nếu người ta phải đặt một bộ phát giữa con người và định dạng để bảo vệ họ khỏi sự mơ hồ, định dạng sẽ mất đi yêu sách thân thiện với con người. JSON tuyên bố ít hơn và chủ yếu thành công khi YAML yêu cầu nhiều hơn và thiếu.
cụ

108

Bạn không thể. Ít nhất đó là kinh nghiệm của tôi từ cái nhìn nhanh vào json.org .

JSON có cú pháp được trực quan hóa trên trang đó. Không có bất kỳ lưu ý về ý kiến.


67

Nhận xét không phải là một tiêu chuẩn chính thức, mặc dù một số trình phân tích cú pháp hỗ trợ nhận xét kiểu C ++. Một cái mà tôi sử dụng là JsonCpp . Trong các ví dụ có cái này:

// Configuration options
{
    // Default encoding for text
    "encoding" : "UTF-8",

    // Plug-ins loaded at start-up
    "plug-ins" : [
        "python",
        "c++",
        "ruby"
        ],

    // Tab indent size
    "indent" : { "length" : 3, "use_space": true }
}

jsonlint không xác nhận điều này. Vì vậy, ý kiến ​​là một phần mở rộng cụ thể của trình phân tích cú pháp và không chuẩn.

Một trình phân tích cú pháp khác là JSON5 .

Một thay thế cho JSON TOML .

Một thay thế khác là jsonc .


Groovy có một số lớp dựng sẵn để xử lý JSON . JsonSlurper có thể xử lý các bình luận. Tất nhiên, các bình luận không được phép trong thông số chính thức, vì vậy hành vi này trong bất kỳ trình phân tích cú pháp nào là không chuẩn và không di động.
izrik

Newtonsoft Json.NET cũng hỗ trợ nhận xét kiểu C mà không gặp vấn đề gì
Tối đa

66

Bạn nên viết một lược đồ JSON thay thế. Lược đồ JSON hiện là một đặc tả dự thảo Internet được đề xuất. Ngoài tài liệu, lược đồ cũng có thể được sử dụng để xác thực dữ liệu JSON của bạn.

Thí dụ:

{
    "description":"A person",
    "type":"object",
    "properties":
        {
            "name":
                {
                    "type":"string"
                },
            "age":
                {
                    "type":"integer",
                    "maximum":125
                }
        }
}

Bạn có thể cung cấp tài liệu bằng cách sử dụng thuộc tính lược đồ mô tả .


5
Lược đồ JSON có còn sống không? Nó tồn tại nhưng nó được hỗ trợ bởi bất kỳ thư viện được biết đến?
Munhitsu

1
vâng, nhóm google lược đồ json hoạt động khá tích cực và tôi muốn giới thiệu JSV để triển khai JavaScript tốt trình xác thực Lược đồ JSON.
xổ số

5
Điều này chỉ giúp với tài liệu có cấu trúc, không phải tài liệu đặc biệt
Juan Mendes

Nếu bạn sử dụng clojure (và tôi chắc chắn rằng bạn không) có một trình phân tích cú pháp lược đồ mã nguồn mở có tính năng hợp lý ở đây: github.com/bigmlcom/closchema
charleslparker

@Munhitsu Manatee.Json (.Net) hỗ trợ rộng rãi lược đồ JSON.
gregsdennis

64

Nếu bạn đang sử dụng Jackson làm trình phân tích cú pháp JSON của mình thì đây là cách bạn kích hoạt nó để cho phép nhận xét:

ObjectMapper mapper = new ObjectMapper().configure(Feature.ALLOW_COMMENTS, true);

Sau đó, bạn có thể có ý kiến ​​như thế này:

{
  key: "value" // Comment
}

Và bạn cũng có thể có ý kiến ​​bắt đầu bằng #cách cài đặt:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

Nhưng nói chung (như đã trả lời trước), đặc điểm kỹ thuật không cho phép bình luận.


50

Đây là những gì tôi tìm thấy trong tài liệu Google Firebase cho phép bạn đưa nhận xét vào JSON:

{
  "//": "Some browsers will use this to enable push notifications.",
  "//": "It is the same for all projects, this is not your project's sender ID",
  "gcm_sender_id": "1234567890"
}

FYI, Cơ sở dữ liệu thời gian thực Firebase không cho phép sử dụng '/' trong một khóa. vì vậy đây có thể là một quy ước tốt đẹp cho việc sử dụng của riêng bạn, nhưng bạn không thể thực hiện nó trong Firebase
gutte

5
Phương pháp này phá vỡ một số thư viện, yêu cầu khóa phải là duy nhất. Tôi đang giải quyết vấn đề đó bằng cách đánh số các bình luận.
MovGP0

bình luận tốt, tôi thấy câu hỏi này trên SO ... phần này dường như không được bao phủ bởi spec stackoverflow.com/questions/21832701/ chủ
mana

4
Tôi có xu hướng sử dụng nó như thế này hiện nay: {"// foo": "foo bình luận", "foo": "foo value", "// bar": "bar comment", "bar": "bar value"} Bạn có thể sử dụng một mảng cho nhiều bình luận: {"// foo": ["foo bình luận 1", "foo bình luận 2"], "foo": '' foo value "}
MovGP0

47

NO . JSON được sử dụng để hỗ trợ các bình luận, nhưng chúng đã bị lạm dụng và bị xóa khỏi tiêu chuẩn.

Từ người tạo ra JSON:

Tôi đã xóa các nhận xét khỏi JSON vì tôi thấy mọi người đang sử dụng chúng để giữ các chỉ thị phân tích cú pháp, một thực tế sẽ phá hủy khả năng tương tác. Tôi biết rằng việc thiếu bình luận làm cho một số người buồn, nhưng không nên. - Douglas Crockford, 2012

Trang web JSON chính thức có tại JSON.org . JSON được định nghĩa là một tiêu chuẩn của ECMA International. Luôn luôn có một quy trình kiến ​​nghị để có các tiêu chuẩn sửa đổi. Không chắc là các chú thích sẽ được thêm vào tiêu chuẩn JSON vì nhiều lý do.

JSON theo thiết kế là một sự thay thế dễ dàng được thiết kế ngược (phân tích cú pháp của con người) với XML. Nó được đơn giản hóa đến mức các chú thích là không cần thiết. Nó thậm chí không phải là một ngôn ngữ đánh dấu. Mục tiêu là sự ổn định và tương tác.

Bất cứ ai hiểu mối quan hệ "có-có" của hướng đối tượng đều có thể hiểu bất kỳ cấu trúc JSON nào - đó là toàn bộ vấn đề. Nó chỉ là một biểu đồ chu kỳ có hướng (DAG) với các thẻ nút (cặp khóa / giá trị), là một cấu trúc dữ liệu gần phổ quát.

Chú thích này chỉ yêu cầu có thể là "// Đây là các thẻ DAG". Các tên chính có thể là thông tin theo yêu cầu, cho phép tính chất ngữ nghĩa tùy ý.

Bất kỳ nền tảng nào cũng có thể phân tích cú pháp JSON chỉ bằng một vài dòng mã. XML yêu cầu các thư viện OO phức tạp không khả thi trên nhiều nền tảng.

Các chú thích sẽ làm cho JSON làm cho ít tương tác hơn. Đơn giản là không có gì khác để thêm vào, trừ khi thứ bạn thực sự cần là ngôn ngữ đánh dấu (XML) và không quan tâm nếu dữ liệu bền vững của bạn dễ dàng được phân tích cú pháp.

NHƯNG là người tạo ra JSON cũng quan sát thấy, luôn có sự hỗ trợ của đường dẫn JS cho các bình luận:

Đi trước và chèn tất cả các ý kiến ​​bạn thích. Sau đó chuyển nó qua JSMin trước khi đưa nó cho trình phân tích cú pháp JSON của bạn. - Douglas Crockford, 2012


37

Nếu tệp văn bản của bạn, là một chuỗi JSON, sẽ được một chương trình nào đó đọc, thì việc loại bỏ các nhận xét kiểu C hoặc C ++ sẽ khó khăn như thế nào trước khi sử dụng nó?

Trả lời: Nó sẽ là một lót. Nếu bạn làm điều đó thì các tệp JSON có thể được sử dụng làm các tệp cấu hình.


1
Có lẽ là đề xuất tốt nhất cho đến nay, mặc dù vẫn là một vấn đề để giữ các tệp như một định dạng trao đổi, vì chúng cần xử lý trước khi sử dụng.
Orble

Tôi đồng ý và đã viết một trình phân tích cú pháp JSON bằng Java, có sẵn tại www.SoftwareMonkey.org, chính xác là như vậy.
Lawrence Dol

2
Mặc dù tôi nghĩ, không nên mở rộng JSON (mà không gọi nó là một định dạng trao đổi khác): đảm bảo bỏ qua "các bình luận" trong chuỗi. {"foo": "/ * Đây không phải là một nhận xét. * /"}
stofl

27
"... sẽ là một lớp lót" umm, không, thực ra, JSON không phải là một ngữ pháp thông thường trong đó một biểu thức chính quy có thể chỉ cần tìm các cặp / * phù hợp. Bạn phải phân tích tệp để tìm xem a / * xuất hiện bên trong một chuỗi (và bỏ qua nó) hay nếu nó thoát (và bỏ qua nó), v.v. Ngoài ra, câu trả lời của bạn không hữu ích vì bạn chỉ suy đoán (không chính xác) thay vì cung cấp bất kì giải pháp nào.
Kyle Simpson

1
Những gì @ kyle-simpson nói. Ngoài ra, anh ta quá khiêm tốn để hướng người đọc đến câu trả lời của riêng mình về việc sử dụng JSON.minify như một cách thay thế cho biểu thức chính quy ad hoc. Làm điều đó, không phải điều này.
cụ

36

Nếu bạn đang sử dụng thư viện Newtonsoft.Json với ASP.NET để đọc / giải nén, bạn có thể sử dụng các nhận xét trong nội dung JSON:

// "tên": "chuỗi"

// "id": int

hoặc là

/* Đây là một

ví dụ bình luận * /

PS: Nhận xét một dòng chỉ được hỗ trợ với hơn 6 phiên bản Newtonsoft Json.

Lưu ý bổ sung cho những người không thể nghĩ ra: Tôi sử dụng định dạng JSON cho các cài đặt cơ bản trong ứng dụng web ASP.NET mà tôi đã tạo. Tôi đọc tệp, chuyển đổi nó thành đối tượng cài đặt với thư viện Newtonsoft và sử dụng nó khi cần thiết.

Tôi thích viết bình luận về từng cài đặt riêng lẻ trong chính tệp JSON và tôi thực sự không quan tâm đến tính toàn vẹn của định dạng JSON miễn là thư viện tôi sử dụng là ổn với nó.

Tôi nghĩ rằng đây là một cách 'dễ sử dụng / hiểu' hơn là tạo một tệp 'settings.README' riêng biệt và giải thích các cài đặt trong đó.

Nếu bạn có một vấn đề với loại sử dụng này; xin lỗi, thần đèn đã tắt đèn Mọi người sẽ tìm thấy các cách sử dụng khác cho định dạng JSON và bạn không thể làm gì về nó.


Thật khó để hiểu tại sao một người nào đó có vấn đề với việc nêu một sự thật.
dvdmn

Tôi cho rằng ai đó đã lấy ngoại lệ vì ở trên không còn là JSON nữa hoặc là JSON không hợp lệ. Có lẽ thêm một từ chối trách nhiệm ngắn sẽ xoa dịu.
cụ

5
Tôi hoàn toàn đồng ý với bạn, và cho đến nay vẫn có 883 lượt upvote cho câu trả lời không trả lời rõ ràng. Độ tinh khiết về ý thức hệ có giá trị trên thông tin hữu ích, đó là SO cho bạn.
Giăng

Vấn đề là một tệp có ý kiến ​​không phải là JSON và sẽ không được phân tích cú pháp bởi nhiều thư viện JSON. Hãy thoải mái làm bất cứ điều gì bạn muốn trong chương trình của riêng bạn nhưng một tệp có ý kiến ​​không phải là JSON. Nếu bạn khẳng định nó thì mọi người sẽ cố gắng phân tích nó bằng ngôn ngữ / thư viện lựa chọn của họ và nó sẽ thất bại. Nó giống như hỏi xem bạn có thể sử dụng dấu ngoặc vuông thay vì dấu ngoặc nhọn trong XML không. Bạn có thể làm bất cứ điều gì bạn muốn nhưng nó sẽ không còn là XML nữa.
gman

32

Ý tưởng đằng sau JSON là cung cấp trao đổi dữ liệu đơn giản giữa các ứng dụng. Chúng thường dựa trên web và ngôn ngữ là JavaScript.

Tuy nhiên, nó không thực sự cho phép nhận xét như vậy, tuy nhiên, việc chuyển một nhận xét là một trong các cặp tên / giá trị trong dữ liệu chắc chắn sẽ hoạt động, mặc dù dữ liệu đó rõ ràng cần phải được bỏ qua hoặc xử lý cụ thể bằng mã phân tích.

Tất cả những gì đã nói, đó không phải là ý định rằng tệp JSON nên chứa các bình luận theo nghĩa truyền thống. Nó chỉ nên là dữ liệu.

Hãy xem trang web JSON để biết thêm chi tiết.


17
Đúng là định dạng JSON không có ý kiến. Cá nhân tôi nghĩ rằng đó là một sai lầm đáng kể - khả năng có nhận xét là siêu dữ liệu (không phải dữ liệu) là một điều rất hữu ích với xml. Các phiên bản dự thảo trước đây của đặc tả JSON đã bao gồm các nhận xét, nhưng vì một số lý do, chúng đã bị loại bỏ. : - /
StaxMan

4
@StaxMan họ đã bỏ chính xác vì mọi người bắt đầu sử dụng chúng làm siêu dữ liệu. Crockford nói rằng nó đã phá vỡ tính tương thích cho định dạng được thiết kế và tôi đồng ý: nếu bạn muốn siêu dữ liệu, tại sao không bao gồm nó như dữ liệu thực tế? Nó thậm chí còn dễ dàng hơn để phân tích theo cách này.
Camilo Martin

6
Siêu dữ liệu thuộc về cấu trúc siêu dữ liệu (ví dụ: thẻ <meta> HTML), không phải là nhận xét. Lạm dụng bình luận cho siêu dữ liệu chỉ là một hack được sử dụng khi không có cấu trúc siêu dữ liệu thực sự tồn tại.
Marnen Laibow-Koser

Đó chính xác là lý do tại sao nó bị loại bỏ: các bình luận được sử dụng làm siêu dữ liệu sẽ phá vỡ khả năng tương tác. Bạn cũng nên lưu trữ dữ liệu meta của mình dưới dạng JSON.
gabious

1
Câu trả lời này là dư thừa với các câu trả lời được viết tốt hơn, được đánh giá cao hơn, về cơ bản là cùng một điều, mặc dù điều này có thể đã được viết trước đó. Cest la vie.
cụ

29

Tôi chỉ gặp điều này cho các tập tin cấu hình. Tôi không muốn sử dụng định dạng XML (dài dòng, đồ họa, xấu, khó đọc) hoặc "ini" (không phân cấp, không có tiêu chuẩn thực, v.v.) hoặc định dạng "Thuộc tính" của Java (như .ini).

JSON có thể làm tất cả những gì họ có thể làm, nhưng đó là cách ít dài dòng hơn và dễ đọc hơn cho con người - và các trình phân tích cú pháp rất dễ dàng và có mặt ở nhiều ngôn ngữ. Nó chỉ là một cây dữ liệu. Nhưng các bình luận ngoài băng thường là một điều cần thiết để ghi lại các cấu hình "mặc định" và tương tự. Cấu hình không bao giờ là "tài liệu đầy đủ", nhưng cây dữ liệu đã lưu có thể đọc được khi cần.

Tôi đoán người ta có thể sử dụng "#": "comment", cho JSON "hợp lệ".


4
Đối với các tệp cấu hình, tôi đề xuất YAML, không phải JSON. Nó (gần như) là một siêu bộ JSON mạnh mẽ hơn, nhưng cũng hỗ trợ các cấu trúc dễ đọc hơn, bao gồm cả các nhận xét.
Marnen Laibow-Koser

1
Bạn nghĩ có bao nhiêu ngôn ngữ hỗ trợ YAML vượt trội so với json?
mmm

@ Hamidam Hơn một tá ngôn ngữ hỗ trợ yaml: yaml.org - nhưng bạn có quyền hỏi có bao nhiêu hỗ trợ tích hợp, mà không cần phụ thuộc vào thư viện của bên thứ ba. Hình như Ruby 1.9.2 thì có. Có ai biết người khác không? Và ngôn ngữ nào hỗ trợ tàu cho json theo mặc định?
nealmcb

5
YAML interop là một lời nói dối: stackoverflow.com/questions/450399/ . Nếu bản năng của bạn là sử dụng JSON cho các tệp cấu hình, hãy làm theo nó.
cụ

Điều này đã cũ, nhưng tôi tin rằng sử dụng # không phải là một ý tưởng tốt. Json gần với cú pháp của một tệp Javascript. Javascript hỗ trợ 2 loại bình luận: // và / * ... * / Nếu tôi là bạn, tôi sẽ gắn bó với một hoặc cả hai loại bình luận này.
Pascal Ganaye

28

JSON không hỗ trợ bình luận một cách tự nhiên, nhưng bạn có thể tạo bộ giải mã của riêng mình hoặc ít nhất là bộ xử lý trước để loại bỏ các bình luận, điều đó hoàn toàn tốt (miễn là bạn bỏ qua các bình luận và không sử dụng chúng để hướng dẫn cách ứng dụng của bạn xử lý dữ liệu JSON ).

JSON không có ý kiến. Một bộ mã hóa JSON PHẢI KHÔNG đưa ra các bình luận. Một bộ giải mã JSON CÓ THỂ chấp nhận và bỏ qua các bình luận.

Bình luận không bao giờ nên được sử dụng để truyền tải bất cứ điều gì có ý nghĩa. Đó là những gì JSON dành cho.

Cf: Douglas Crockford, tác giả của thông số JSON .


4
Crockford sau đó tiếp tục viết: "Giả sử bạn đang sử dụng JSON để giữ các tệp cấu hình mà bạn muốn chú thích. Hãy tiếp tục và chèn tất cả các nhận xét bạn muốn. Sau đó chuyển nó qua JSMin trước khi đưa nó vào trình phân tích cú pháp JSON của bạn." Xem câu trả lời của @ kyle-simpson về JSON.minify để biết thêm thông tin.
toolbear

28

Nó phụ thuộc vào thư viện JSON của bạn. Json.NET hỗ trợ các bình luận kiểu JavaScript , /* commment */.

Xem một câu hỏi khác về Stack Overflow .


Và tôi tin rằng đó là lý do tại sao tôi thấy một nhận xét trong một ảnh chụp màn hình trên trang xem trước ASP.NET vNext này (dưới package.json): blogs.msdn.com/b/webdev/archive/2014/06/03/... mặc dù tôi thiên đường Tôi chưa tìm thấy bất cứ điều gì trong thông số kỹ thuật.
webXL

27

JSON có ý nghĩa rất lớn đối với các tệp cấu hình và cách sử dụng cục bộ khác vì nó phổ biến và vì nó đơn giản hơn nhiều so với XML.

Nếu mọi người có lý do mạnh mẽ để không có nhận xét trong JSON khi truyền dữ liệu (dù hợp lệ hay không), thì có thể JSON có thể được chia thành hai:

  • JSON-COM: JSON trên dây hoặc quy tắc áp dụng khi giao tiếp dữ liệu JSON.
  • JSON-DOC: Tài liệu JSON hoặc JSON trong tệp hoặc cục bộ. Các quy tắc xác định một tài liệu JSON hợp lệ.

JSON-DOC sẽ cho phép các bình luận và các khác biệt nhỏ khác có thể tồn tại như xử lý khoảng trắng. Trình phân tích cú pháp có thể dễ dàng chuyển đổi từ thông số này sang thông số khác.

Liên quan đến nhận xét của Douglas Crockford về vấn đề này (được tham khảo bởi @Artur Czajka)

Giả sử bạn đang sử dụng JSON để giữ các tệp cấu hình mà bạn muốn chú thích. Đi trước và chèn tất cả các ý kiến ​​bạn thích. Sau đó chuyển nó qua JSMin trước khi đưa nó cho trình phân tích cú pháp JSON của bạn.

Chúng ta đang nói về một vấn đề tệp cấu hình chung (ngôn ngữ chéo / nền tảng) và anh ấy đang trả lời với một tiện ích cụ thể của JS!

Chắc chắn rằng một minify cụ thể của JSON có thể được triển khai bằng bất kỳ ngôn ngữ nào, nhưng tiêu chuẩn hóa nó để nó trở nên phổ biến trên các trình phân tích cú pháp trong tất cả các ngôn ngữ và nền tảng để mọi người ngừng lãng phí thời gian của họ vì họ có các trường hợp sử dụng tốt cho nó, tìm kiếm vấn đề diễn đàn trực tuyến và để mọi người nói với họ đó là một ý tưởng tồi hoặc cho thấy thật dễ dàng để thực hiện tước bình luận ra khỏi các tệp văn bản.

Vấn đề còn lại là khả năng tương tác. Giả sử bạn có thư viện hoặc API hoặc bất kỳ loại hệ thống con nào có một số tệp cấu hình hoặc dữ liệu được liên kết với nó. Và hệ thống con này sẽ được truy cập từ các ngôn ngữ khác nhau. Sau đó, bạn có đi nói với mọi người không: nhân tiện đừng quên loại bỏ các nhận xét từ các tệp JSON trước khi chuyển chúng cho trình phân tích cú pháp!


Không cần phải phân đoạn JSON. JSON với ý kiến ​​không còn là JSON. Nhưng việc chú thích JSON của bạn với các bình luận là hoàn toàn chấp nhận được, miễn là bạn đảm bảo loại bỏ chúng trước khi phân tích hoặc truyền nó. Không bao giờ nên có trách nhiệm của người nhận để làm điều này.
cụ

json5.org là một giải pháp cho json-doc
Michael Freidgeim

24

Nếu bạn sử dụng JSON5, bạn có thể bao gồm các ý kiến.


JSON5 là một phần mở rộng được đề xuất cho JSON nhằm mục đích giúp con người dễ dàng viết và bảo trì bằng tay hơn. Nó thực hiện điều này bằng cách thêm một số tính năng cú pháp tối thiểu trực tiếp từ ECMAScript 5.


5
Bạn có thể vui lòng thêm một ví dụ? Sau đó, bạn thực sự có thể cần những nhân vật phụ.
dgilperez

6
Đó là yêu cầu của hướng dẫn SO để cung cấp một câu trả lời thực tế. Câu trả lời chỉ liên kết là không mong muốn. Bạn có thể kiểm tra hướng dẫn stackoverflow.com/help/how-to-answer
dgilperez

2
SO được kiểm duyệt bởi người dùng của nó. Điều đó có nghĩa là tôi có thể cung cấp câu trả lời nếu tôi có nó giống như cách tôi có thể nhận xét của bạn nếu nó không tuân theo hướng dẫn. Đó là cách SO trở thành một nguồn tài nguyên tuyệt vời.
dgilperez

22

Bộ công cụ JavaScript của Bộ công cụ Dojo (ít nhất là từ phiên bản 1.4), cho phép bạn đưa các nhận xét vào JSON của mình. Các ý kiến ​​có thể có /* */định dạng. Bộ công cụ Dojo tiêu thụ JSON thông qua dojo.xhrGet()cuộc gọi.

Các bộ công cụ JavaScript khác có thể hoạt động tương tự.

Điều này có thể hữu ích khi thử nghiệm các cấu trúc dữ liệu thay thế (hoặc thậm chí danh sách dữ liệu) trước khi chọn tùy chọn cuối cùng.


4
Không. Không phải cái này. JSON không có ý kiến. Nếu bạn chọn chú thích JSON của mình bằng các bình luận, hãy thu nhỏ nó trước khi phân tích hoặc truyền. Đây không phải là trách nhiệm của người nhận.
cụ

2
Tôi không nói rằng JSON có ý kiến. Tôi cũng không có ý ám chỉ rằng việc đưa chúng vào JSON của bạn, đặc biệt là trong một hệ thống sản xuất. Tôi đã nói rằng bộ công cụ Dojo cho phép bạn thêm chúng, điều này (hoặc ít nhất, là) thực sự đúng. Có những trường hợp sử dụng rất hữu ích ngoài kia để làm như vậy trong giai đoạn thử nghiệm của bạn.
David

1
Thật tệ khi phục vụ bình luận, và do đó JSON không hợp lệ, điều này dojo.xhrGet()hoàn toàn khuyến khích bằng cách chấp nhận.
cụ

Tôi vẫn bỏ phiếu để nâng cấp thông số JSON để cho phép nhận xét. Tôi là tất cả để thu nhỏ và tước các nhận xét trước khi truyền JSON, nhưng không có bất kỳ khả năng nào để nhận xét JSON của bạn theo bất kỳ cách tiêu chuẩn nào mà không phải chuyển qua một tiện ích riêng biệt trước khi phân tích cú pháp có vẻ ngớ ngẩn. Tôi cũng làm cho không thể sử dụng trình soạn thảo JSON trên các tệp cấu hình JSON của bạn, vì các tệp của bạn không phải là JSON hợp lệ.
Craig

20

JSON không phải là một giao thức đóng khung . Nó là một định dạng ngôn ngữ miễn phí . Vì vậy, định dạng của một nhận xét không được xác định cho JSON.

Như nhiều người đã đề xuất, có một số thủ thuật, ví dụ, các khóa trùng lặp hoặc một khóa cụ thể _commentmà bạn có thể sử dụng. Tuỳ bạn.


18

Bạn có thể có ý kiến ​​trong JSONP , nhưng không có JSON thuần túy. Tôi vừa dành một giờ để cố gắng làm cho chương trình của mình hoạt động với ví dụ này từ Highcharts: http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

Nếu bạn theo liên kết, bạn sẽ thấy

?(/* AAPL historical OHLC data from the Google Finance API */
[
/* May 2006 */
[1147651200000,67.79],
[1147737600000,64.98],
...
[1368057600000,456.77],
[1368144000000,452.97]
]);

Vì tôi có một tệp tương tự trong thư mục cục bộ của mình, không có vấn đề gì với chính sách Cùng nguồn gốc , vì vậy tôi đã quyết định sử dụng JSON thuần túy ... và tất nhiên, $.getJSONđã thất bại trong âm thầm vì các bình luận.

Cuối cùng, tôi vừa gửi một yêu cầu HTTP thủ công đến địa chỉ trên và nhận ra rằng kiểu nội dung là text/javascriptdo, JSONP trả về JavaScript thuần. Trong trường hợp này ý kiến được cho phép . Nhưng ứng dụng của tôi trả về kiểu nội dung application/json, vì vậy tôi phải xóa các bình luận.


17

Đây là một câu hỏi "bạn có thể" . Và đây là câu trả lời "có" .

Không, bạn không nên sử dụng các thành viên đối tượng trùng lặp để nhét dữ liệu kênh bên vào mã hóa JSON. (Xem "Tên trong một đối tượng NÊN là duy nhất" trong RFC ).

Và vâng, bạn có thể chèn các bình luận xung quanh JSON mà bạn có thể phân tích.

Nhưng nếu bạn muốn một cách chèn và trích xuất dữ liệu kênh phụ tùy ý vào JSON hợp lệ, đây là một câu trả lời. Chúng tôi tận dụng sự biểu diễn dữ liệu không phải là duy nhất trong mã hóa JSON. Điều này được cho phép * trong phần hai của RFC trong "khoảng trắng được phép trước hoặc sau bất kỳ sáu ký tự cấu trúc nào".

* RFC chỉ nêu "khoảng trắng được phép trước hoặc sau bất kỳ sáu ký tự cấu trúc nào", không đề cập rõ ràng đến chuỗi, số, "sai", "đúng" và "null". Thiếu sót này được bỏ qua trong TẤT CẢ các triển khai.


Đầu tiên, chuẩn hóa JSON của bạn bằng cách thu nhỏ nó:

$jsonMin = json_encode(json_decode($json));

Sau đó mã hóa nhận xét của bạn trong nhị phân:

$hex = unpack('H*', $comment);
$commentBinary = base_convert($hex[1], 16, 2);

Sau đó steg nhị phân của bạn:

$steg = str_replace('0', ' ', $commentBinary);
$steg = str_replace('1', "\t", $steg);

Đây là đầu ra của bạn:

$jsonWithComment = $steg . $jsonMin;

1
RFC chỉ nêu "khoảng trắng được cho phép trước hoặc sau bất kỳ sáu ký tự cấu trúc nào", không đề cập rõ ràng đến chuỗi, số, "false", "true", "null". Thiếu sót này được bỏ qua trong TẤT CẢ các triển khai.
William Entriken

1
Để có mật độ bình luận lớn hơn, bạn không thể mã hóa bình luận của mình theo thời gian và sử dụng không gian, tab và dòng mới để bỏ qua nó?
Claire Nielsen

NÊN KHÔNG PHẢI. Xem RFC 2119 bao gồm rõ ràng: PHẢI: Từ này, hoặc các thuật ngữ "BẮT BUỘC" hoặc "SALLN", có nghĩa là định nghĩa là một yêu cầu tuyệt đối của đặc tả. ... NÊN: Từ này, hoặc tính từ "KHUYẾN NGHỊ", có nghĩa là có thể tồn tại những lý do hợp lệ trong các trường hợp cụ thể để bỏ qua một mục cụ thể, nhưng ý nghĩa đầy đủ phải được hiểu và cân nhắc cẩn thận trước khi chọn một khóa học khác.
Jeff K

Tài liệu tham khảo tốt. Một lý do tốt hơn chống lại việc sử dụng các khóa trùng lặp là câu trích dẫn tiêu chuẩn "Khi tên trong một đối tượng không phải là duy nhất, hành vi của phần mềm nhận được một đối tượng như vậy là không thể đoán trước." Ngoài ra bây giờ tôi đã hiểu tại sao tiêu chuẩn không phải là "PHẢI là duy nhất", điều này làm cho trình xác nhận đơn giản hơn, nó chỉ cần theo dõi [và {, không cần biết khóa nào đã được sử dụng.
William Entriken

16

TUYÊN BỐ TỪ CHỐI: ĐÂY LÀ SILLY

Thực sự có một cách để thêm ý kiến ​​và ở trong thông số kỹ thuật (không cần thêm trình phân tích cú pháp). Nó sẽ không dẫn đến các bình luận có thể đọc được mà không có bất kỳ loại phân tích cú pháp nào.

Bạn có thể lạm dụng như sau:

Khoảng trắng không đáng kể được cho phép trước hoặc sau bất kỳ mã thông báo nào. Khoảng trắng là bất kỳ chuỗi nào của một hoặc nhiều điểm mã sau: lập bảng ký tự (U + 0009), nguồn cấp dữ liệu (U + 000A), trả về vận chuyển (U + 000D) và khoảng trắng (U + 0020).

Theo cách hacky, bạn có thể lạm dụng điều này để thêm một bình luận. Ví dụ: bắt đầu và kết thúc bình luận của bạn bằng một tab. Mã hóa nhận xét trong base3 và sử dụng các ký tự khoảng trắng khác để thể hiện chúng. Ví dụ.

010212 010202 011000 011000 011010 001012 010122 010121 011021 010202 001012 011022 010212 011020 010202 010202

( hello base threetrong ASCII) Nhưng thay vì 0 sử dụng không gian, cho 1 sử dụng nguồn cấp dữ liệu và cho 2 sử dụng trả lại vận chuyển.

Điều này sẽ chỉ để lại cho bạn rất nhiều khoảng trắng không thể đọc được (trừ khi bạn tạo một plugin IDE để mã hóa / giải mã nó một cách nhanh chóng).

Tôi thậm chí không bao giờ thử điều này, vì lý do rõ ràng và bạn cũng không nên.


12

Chúng tôi đang sử dụng strip-json-commentscho dự án của chúng tôi. Nó hỗ trợ một cái gì đó như:

/*
 * Description 
*/
{
    // rainbows
    "unicorn": /* ❤ */ "cake"
}

Đơn giản chỉ cần npm install --save strip-json-commentscài đặt và sử dụng nó như:

var strip_json_comments = require('strip-json-comments')
var json = '{/*rainbows*/"unicorn":"cake"}';
JSON.parse(strip_json_comments(json));
//=> {unicorn: 'cake'}

Lưu ý rằng đó jsonkhông phải là một JSON hợp lệ nữa khi nó bao gồm các nhận xét sở hữu này.
Roy Prins

12

Trong trường hợp của tôi, tôi cần sử dụng các nhận xét cho mục đích gỡ lỗi, trước khi xuất cấu trúc JSON. Vì vậy, tôi quyết định sử dụng thông tin gỡ lỗi trong tiêu đề HTTP, để tránh phá vỡ ứng dụng khách:

header("My-Json-Comment: Yes, I know it's a workaround ;-) ");

Nhập mô tả hình ảnh ở đây


12

JSON không cho phép bình luận, mỗi lần. Lý do là hoàn toàn ngu ngốc, bởi vì bạn có thể sử dụng JSON bản thân để tạo ra ý kiến, mà obviates sự lập luận hoàn toàn, tải các không gian dữ liệu phân tích cú pháp không có lý do tốt ở tất cả cho chính xác kết quả tương tự và các vấn đề tiềm năng, chẳng hạn như họ là: a JSON tập tin có ý kiến.

Nếu bạn cố gắng đưa ý kiến ​​vào (sử dụng //hoặc /* */hoặc #ví dụ), thì một số trình phân tích cú pháp sẽ thất bại vì điều này hoàn toàn không nằm trong đặc tả JSON. Vì vậy, bạn không bao giờ nên làm điều đó.

Đây là một ví dụ, trong đó hệ thống xử lý hình ảnh của tôi đã lưu các ký hiệu hình ảnh và một số thông tin định dạng (bình luận) cơ bản liên quan đến chúng (ở phía dưới):

{
    "Notations": [
        {
            "anchorX": 333,
            "anchorY": 265,
            "areaMode": "Ellipse",
            "extentX": 356,
            "extentY": 294,
            "opacity": 0.5,
            "text": "Elliptical area on top",
            "textX": 333,
            "textY": 265,
            "title": "Notation 1"
        },
        {
            "anchorX": 87,
            "anchorY": 385,
            "areaMode": "Rectangle",
            "extentX": 109,
            "extentY": 412,
            "opacity": 0.5,
            "text": "Rect area\non bottom",
            "textX": 98,
            "textY": 385,
            "title": "Notation 2"
        },
        {
            "anchorX": 69,
            "anchorY": 104,
            "areaMode": "Polygon",
            "extentX": 102,
            "extentY": 136,
            "opacity": 0.5,
            "pointList": [
                {
                    "i": 0,
                    "x": 83,
                    "y": 104
                },
                {
                    "i": 1,
                    "x": 69,
                    "y": 136
                },
                {
                    "i": 2,
                    "x": 102,
                    "y": 132
                },
                {
                    "i": 3,
                    "x": 83,
                    "y": 104
                }
            ],
            "text": "Simple polygon",
            "textX": 85,
            "textY": 104,
            "title": "Notation 3"
        }
    ],
    "imageXW": 512,
    "imageYW": 512,
    "imageName": "lena_std.ato",
    "tinyDocs": {
        "c01": "JSON image notation data:",
        "c02": "-------------------------",
        "c03": "",
        "c04": "This data contains image notations and related area",
        "c05": "selection information that provides a means for an",
        "c06": "image gallery to display notations with elliptical,",
        "c07": "rectangular, polygonal or freehand area indications",
        "c08": "over an image displayed to a gallery visitor.",
        "c09": "",
        "c10": "X and Y positions are all in image space. The image",
        "c11": "resolution is given as imageXW and imageYW, which",
        "c12": "you use to scale the notation areas to their proper",
        "c13": "locations and sizes for your display of the image,",
        "c14": "regardless of scale.",
        "c15": "",
        "c16": "For Ellipses, anchor is the  center of the ellipse,",
        "c17": "and the extents are the X and Y radii respectively.",
        "c18": "",
        "c19": "For Rectangles, the anchor is the top left and the",
        "c20": "extents are the bottom right.",
        "c21": "",
        "c22": "For Freehand and Polygon area modes, the pointList",
        "c23": "contains a series of numbered XY points. If the area",
        "c24": "is closed, the last point will be the same as the",
        "c25": "first, so all you have to be concerned with is drawing",
        "c26": "lines between the points in the list. Anchor and extent",
        "c27": "are set to the top left and bottom right of the indicated",
        "c28": "region, and can be used as a simplistic rectangular",
        "c29": "detect for the mouse hover position over these types",
        "c30": "of areas.",
        "c31": "",
        "c32": "The textx and texty positions provide basic positioning",
        "c33": "information to help you locate the text information",
        "c34": "in a reasonable location associated with the area",
        "c35": "indication.",
        "c36": "",
        "c37": "Opacity is a value between 0 and 1, where .5 represents",
        "c38": "a 50% opaque backdrop and 1.0 represents a fully opaque",
        "c39": "backdrop. Recommendation is that regions be drawn",
        "c40": "only if the user hovers the pointer over the image,",
        "c41": "and that the text associated with the regions be drawn",
        "c42": "only if the user hovers the pointer over the indicated",
        "c43": "region."
    }
}

Liên kết "lý luận" bị hỏng. Bất kỳ cơ hội tìm thấy một liên kết hiện tại đến nó?
Don nở

Thật không may, Google đã giết chết hệ thống truyền thông xã hội có chứa bài đăng; Tôi không biết người gốc đã đi đâu từ đó, nếu ở bất cứ đâu. Tuy nhiên, tôi sẽ hủy liên kết trong thông tin trên để xóa bỏ sự mơ hồ. Cảm ơn.
fyngyrz

Lý do không phải là ngu ngốc, và bạn chỉ cần chứng minh điều đó. Thực hiện ý kiến ​​như các thẻ bảo tồn khả năng tương tác . Đây chính xác là lý do tại sao Crockford muốn các bình luận được phân tích cú pháp dưới dạng thẻ. Bây giờ mọi thứ chỉ là một thẻ và phân tích cú pháp theo cùng một cách .
Đaminh Cerisano

Nếu thông số kỹ thuật nói rằng "một dòng bắt đầu bằng # là một nhận xét", thì điều đó sẽ hoàn toàn tương thích. Vì thế, các bình luận đều tải không gian của trình phân tích cú pháp, vì chúng là các mục được phân tích cú pháp hợp lệ thay vì được hiểu là các bình luận và chúng có thể khác nhau cho mỗi tệp .json tồn tại. Trong khi nếu (ví dụ) thông số kỹ thuật cho biết "các dòng bắt đầu bằng # là nhận xét" thì trình phân tích cú pháp có thể bỏ qua các dòng đó mà không cần phân tích cú pháp (nhanh hơn) và không tải không gian trình phân tích cú pháp (sử dụng bộ nhớ tốt hơn). ý kiến ​​trong .json, chỉ có nhược điểm.
fyngyrz

11

Để cắt một mục JSON thành các phần tôi thêm dòng "bình luận giả":

{

"#############################" : "Part1",

"data1"             : "value1",
"data2"             : "value2",

"#############################" : "Part2",

"data4"             : "value3",
"data3"             : "value4"

}

15
Bạn đã mô phỏng cấu trúc tệp INI trong JSON. Xin vui lòng, đặt Búa Vàng của bạn xuống.
Artur Czajka

4
RFC nói "Tên trong một đối tượng NÊN là duy nhất". Cũng thấy người này đang gặp lỗi khi phân tích cú pháp JSON như trên: stackoverflow.com/questions/4912386/
mẹo

Nếu bạn đang sử dụng lược đồ để xác thực JSON, nó có thể bị lỗi do các trường bổ sung.
gregsdennis

1
Nếu bạn thực sự quyết tâm thêm nhận xét vào JSON của mình, sẽ có ý nghĩa hơn nhiều khi làm điều gì đó như thế này: { "comment-001":"This is where you do abc...", "comment-002":"This is where you do xyz..." } Điều này giữ cho tên duy nhất và cho phép bạn thêm bất kỳ giá trị chuỗi nào bạn thích. Đây vẫn là một loại bùn, vì các bình luận không phải là một phần của JSON của bạn. Như một cách khác, tại sao không thêm nhận xét trước hoặc sau JSON của bạn, nhưng không phải trong đó?
Jazimov
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.