a

Câu hỏi Bình luận có thể được sử dụng trong JSON?


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, làm thế nào?


5797
2017-10-28 20:39


gốc


@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 có thể làm với ý kiến. Tôi cho một thường có ý kiến ​​trong các tập tin dữ liệu. Các tệp XML, ini và nhiều định dạng khác bao gồm các điều khoản cho nhận xét. - Michael Burr
Nếu bạn, như tôi, đã tự hỏi liệu //comments được chấp nhận cho trường hợp sử dụng cụ thể của tệp cấu hình Siêu văn bản, câu trả lời là có (như của phiên bản 2). Sublime Text sẽ không phàn nàn về nó, ít nhất, trong khi nó sẽ phàn nàn về {"__comment": ...} trong bảng điều khiển, bởi vì nó là một trường không mong muốn. - hangtwenty
và có lẽ đây là một lý do khiến TOML được tạo ra .. - Alex Nolasco
Hơi noobish nhưng, tôi cũng đã cố gắng sử dụng // cho ý kiến ​​trong JSON. Bây giờ tôi nhận ra nó được sử dụng đúng cho trao đổi / trao đổi. Thở dài! Tôi không thể bình luận nữa: (Cuộc sống là doomed !. - Sid
JSON5 hỗ trợ nhận xét: stackoverflow.com/a/7901053/108238 - schoetbi


Các câu trả lời:


Không.

Tất cả JSON phải là dữ liệu và nếu bạn đưa vào nhận xét, thì nó cũng sẽ là dữ liệu.

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

Bạn có lẽ sẽ tốt hơn khi có nhận xét trong các quá trình tạo / nhận JSON, vì chúng được cho là biết dữ liệu JSON sẽ là gì trước, 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"
            }
         }
      }
   }
}

4066
2017-10-28 21:01



Nó có thể trả tiền để có một số loại tiền tố trên bình luận 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
Một giải thích / lý do khá gần đây về lý do tại sao không có nhận xét nào trong JSON (hoặc chính xác hơn, tại sao chúng bị xóa sớm): plus.google.com/118095276221607585885/posts/RK8qyGVaGSr Cũng thấy, tech.groups.yahoo.com/group/json/message/156 và thảo luận khác trong chủ đề đó. - Michael Burr
BTW, thư viện json cho Java google-gsoncó hỗ trợ cho ý kiến. - centic
Còn nếu tôi muốn nhận xét riêng về Accronym và Abbrev tính chất? Tôi đã sử dụng mẫu này trước nhưng dừng lại vì nó không cho phép tôi làm điều đó. Nó là một hack. Có lẽ nếu tôi thêm một tên thuộc tính với __comment__ thay thế. Đó là "__comment__Abbrev", vẫn là một hack, nhưng sẽ cho phép tôi bình luận về tất cả các prpoerties - Juan Mendes
bạn cũng có thể sử dụng "//": điều 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 bậc cha mẹ - smnbbrv


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

  • http://www.json.org
  • RFC 4627: Các application/json Loại phương tiện cho ký pháp đối tượng JavaScript (JSON)
  • RFC 7159 Định dạng trao đổi dữ liệu đối tượng JavaScript (JSON) - Lỗi thời: 4627, 7158

1569
2017-11-15 09:32



Nếu bạn muốn chú thích JSON của bạn với các chú thích (do đó làm cho nó không hợp lệ JSON), sau đó rút gọn nó trước khi phân tích cú pháp hoặc truyền. Bản thân 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. - toolbear
@alkuzad: Khi nói đến ngữ pháp chính thức, phải có điều gì đó rõ ràng nói rằng họ là cho phép, không phải là cách khác xung quanh. 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 bị 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
Vâng. Định dạng JSON có nhiều khoảng trống giữa các phần tử và không phân biệt không gian trong các vùng đó, vì vậy không có lý do gì khiến bạn không thể có nhận xét đơn hoặc nhiều dòng ở đó. Nhiều trình phân tích cú pháp và bộ lọc cũng hỗ trợ nhận xét JSON, vì vậy, hãy đảm bảo 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 dữ liệu ứng dụng và cài đặt cấu hình, do đó, các nhận xét là cần thiết ngay bây giờ. "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 lo ngại về kích thước hoặc hiệu suất tải trọng. - Triynko
Mặc dù câu trả lời của bạn là hoàn toàn chính xác, nhưng phải nói rằng đây là BS. Với rất nhiều người dùng cuối cùng gặp phải nhu cầu về cấu hình json, thì nhận xét cực kỳ hữu ích. Chỉ vì một số nón lá thiếc quyết định rằng JSON Là và phải luôn luôn máy có thể đọc được, bỏ qua thực tế là con người cần đọc nó, là imho một sự tinh nghịch của trí óc nhỏ bé. - cmroanirgo
@cmroanirgo: Bạn rõ ràng 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 tự động 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ế là JSON là gì. Thay vào đó, tôi thấy thật thú vị khi mọi người bắt đầu sử dụng JSON cho những mục đích mà nó rõ ràng là không đủ ở nơi đầu tiên, với giới hạn được đề cập. Đừng đổ lỗi cho định dạng JSON; đổ lỗi cho bản thân vì khăng khăng sử dụng nó, nơi nó không phải là một sự phù hợp đặc biệt tốt. - stakx


Bao gồm nhận xét nếu bạn chọn; tách chúng ra bằng một bộ phân tách trước khi phân tích cú pháp hoặc truyền đi.

Tôi vừa mới phát hành JSON.minify () sẽ loại bỏ các nhận xét 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 lớn của những 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 nhận xét 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. Tiếp tục và chèn tất cả các bình luận bạn thích. Sau đó, chuyển nó qua JSMin trước khi giao nó cho trình phân tích cú pháp JSON của bạn. - - Douglas Crockford, 2012

Hy vọng rằng đó là 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.


678
2018-06-23 18:20



Vấn đề duy nhất tôi có với JSON.minify () là nó thực sự rất chậm. Vì vậy, tôi đã thực hiện của riêng mình mà làm điều tương tự: gist.github.com/1170297 . Trên một số tệp thử nghiệm lớn, việc triển khai của bạn mất 74 giây và thời gian của tôi là 0,06 giây. - WizKid
nó sẽ là tuyệt vời 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
@MiniGod Tôi đã nghe suy nghĩ của Doug về chủ đề này nhiều lần. Tôi đã đề cập đến họ từ lâu trong bài đăng trên blog của tôi: blog.getify.com/json-comments - Kyle Simpson
@ 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): siêu dữ liệu chẩn đoán như thời gian tạo hoặc nguồn là sử dụng phổ biến với XML và hoàn toàn hợp lý cho dữ liệu JSON. Các đối số chống lại các nhận xét là nông cạn và bất kỳ định dạng dữ liệu văn bản nào cũng cho phép nhận xét, bất kể ý định sử dụng được ngụ ý (không có thông số nào đề xuất JSON không thể được sử dụng ở nơi khác, fwiw) - StaxMan
Nếu JSON có sự chấp nhận phổ quát (về cơ bản nó) thì nó sẽ có ứng dụng phổ quát. Ví dụ: JSON có thể đóng vai trò là tệp cấu hình ứng dụng. Ứng dụng này sẽ mong muốn nhận xét. - eggmatters


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

Tôi đã xóa 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 tiễn có thể đã phá hủy khả năng tương tác. Tôi biết rằng việc thiếu bình luận khiến 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. Tiếp tục và chèn tất cả các bình luận bạn thích. Sau đó, chuyển nó qua JSMin trước khi giao 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 về G +


379
2018-06-11 08:52



Tôi nghĩ JSON được cho là có thể đọc được nhiều hơn con người, XML? Nhận xét là để dễ đọc. - intrepidis
Dù sao, bạn có thể nghịch ngợm và thêm chỉ thị 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
Ý kiến ​​cá nhân: không cho phép bình luận IS lame. Tôi không có tùy 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 nhận xét, để giải mã các tệp cấu hình của tôi. - caiosm1005
@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 nó có ý nghĩa hơn nhiều khi sử dụng chúng trên JSON cho các tệp cấu hình. Cảm ơn phản ứng và hy vọng nhiều người sẽ thay đổi suy nghĩ của họ khi họ đọc cuộc trò chuyện này. (làm cho một phân tích cú pháp được nhiều hơn một bài tập nào :) - caiosm1005
Điều đó giống như yêu cầu tất cả xe đạp phải có bánh xe đào tạo vì một số người không thể đi xe đạp. Loại bỏ một tính năng quan trọng vì những người ngu ngốc lạm dụng nó là thiết kế tồi. Một định dạng dữ liệu nên ưu tiên khả năng sử dụng hơn là chống idiot. - Phil Goetz


DISCLAIMER: BẢO HÀNH CỦA BẠN LÀ VOID

Như đã được chỉ ra, hack này tận dụng lợi thế của việc thực hiện các spec. 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 trực tuyến đặ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ứ thứ gì. Dưới đây là câu trả lời gốc.


Tôi đã tìm thấy một chút hack cho phép bạn đặt các nhận xét 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 biểu diễn theo bất kỳ cách nào.

Có vẻ như khi khai báo một đối tượng theo nghĩa đen bạn có thể chỉ định hai giá trị với cùng một khóa, và giá trị cuối cùng được ưu tiên. Tin tưởng rằng nó hay không, nó chỉ ra rằng JSON parsers làm việc 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 chú thích trong JSON nguồn sẽ không có mặt trong một 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 đã nhận xét của bạn có thể trông giống như sau:

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

Mã trên là JSON hợp lệ. Nếu bạn phân tích nó, 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 ý kiến, và họ sẽ không có phản ứng phụ lạ.

Hacking hạnh phúc!


192
2017-08-02 13:46



Từ các đặc điểm kỹ thuật: Tên trong một đối tượng NÊN là duy nhất. - Quentin
"tất cả các triển khai xử lý nó như nhau" - Đó là một điều khó khăn để chứng minh. - Quentin
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! - sep332
Điều này rõ ràng vi phạm các spec (xem ý kiến ​​ở trên), không làm điều này. ietf.org/rfc/rfc4627.txt?number=4627 - voidlogic
KHÔNG - nếu trình phân tích cú pháp đang phát trực tuyến thì sao? Điều gì sẽ xảy ra nếu trình phân tích cú pháp đọc nó vào một từ điển mà thứ tự khóa không xác định? giết cái này bằng lửa. - deanWombourne


JSON không hỗ trợ nhận xét. 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 có 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 thoải mái, ít lỗi hơn, nhiều nhận xét hơn.

Hjson intro

Xem hjson.org cho các thư viện JavaScript, Java, Python, PHP, Rust, Go, Ruby và C #.


123
2018-03-20 15:26



Được thăng hạng. Rõ ràng là một sự thay đổi tốt, những người bảo thủ cởi mở sẽ chỉ thích ghét. Tôi hy vọng triển khai của bạn được biết rõ hơn - và có lẽ thậm chí còn phổ biến hơn bản gốc;) Tôi hy vọng một người nào đó cũng sẽ triển khai 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. Là một "nhà phát triển" thận trọng nếu bạn là người không chứng minh rằng bạn tốt hơn và bạn thậm chí có thể còn tồi tệ hơn khi giữ mình bị nhốt trong không gian hạn chế. Đừng đánh giá mọi người là những nhà phát triển khủng khiếp một cách dễ dàng. - konsolebox
Xin lỗi về điều đó, @konsolebox. Có lẽ bạn có thể cân nhắc lại chế độ xem "JSON được xác định rõ ràng của bạn là ý kiến ​​của bạn" sau khi đọc ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf Đó 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, sự 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 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 phân mảnh thì tệ hơn. Và vâng, đó chỉ là ý kiến ​​và bạn tự do không đồng ý. - adelphus
Tôi ngưỡng mộ bạn, nhưng bạn đang tái phát minh ra YAML. Nếu bạn muốn tính linh hoạt của rất nhiều 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/…) hoặc gắn bó với sự quấy rối, nhưng JSON rõ ràng. - toolbear
Tôi thấy định dạng cấu hình thân thiện nhất vẫn là INI. Nó đơn giản và không phải cú pháp rất nặng. Điều này làm cho nó ít đáng sợ cho người dùng chỉ cần nhúng ngón chân của họ trong ao cấu hình. - Matt
Bất cứ khi nào bạn cần json như cấu hình (nơi bình luận là cần thiết) - đặt tên tệp là ".js" thay vì ".json" .. js tất nhiên có thể xử lý bất kỳ đối tượng json hợp lệ nào và bổ sung có thể xử lý bình luận .. Đó là lý do tại sao nó là "webpack.config.js" và không phải là "webpack.config.json" (cũng có nhiều lý do hơn cho điều đó trong webpack: P) - jebbie


Bạn không thể. Ít nhất đó là trải nghiệm của tôi chỉ trong nháy mắt json.org.

JSON có cú pháp được hiển thị trên trang đó. Không có bất kỳ lưu ý nào về nhận xét.


95
2017-10-28 20:42





Xem xét sử dụng YAML. Nó gần như là một siêu 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.


86
2017-08-31 02:24



@ g33kz0r Chính xác, do đó mô tả của tôi về YAML như là một siêu gần của JSON. - Marnen Laibow-Koser
@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à câu trả lời. - Marnen Laibow-Koser
Nhược điểm: yaml thư viện không được chuyển bằng Python. - Bleeding Fingers
@BleedingFingers Vì vậy, hãy cài đặt nó ... - Marnen Laibow-Koser
@ marnen-laibow-koser: yup, nó phải là không đủ năng lực để sử dụng các thư viện YAML có sẵn cho Java và Perl và mong đợi YAML được sản xuất bởi mỗi cái sẽ được người khác tiêu thụ mà không có lỗi. Sự tương tác YAML đó là một vấn đề, nhưng JSON interop không, hoàn toàn được giải thích bởi sự thiếu kiến ​​thức của tôi. - toolbear


Bạn nên viết một Giản đồ JSON thay thế. Giản đồ 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 sự miêu tả thuộc tính lược đồ.


55
2017-07-28 18:38



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
Vâng json-schema google group là khá tích cực và tôi muốn giới thiệu JSV để thực hiện JavaScript tốt của trình xác nhận hợp lệ JSON Schema. - raffel
Đ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 ad-hoc - Juan Mendes
Nếu bạn sử dụng clojure (và tôi chắc chắn bạn không) có một trình phân tích lược đồ JSON nguồn mở có tính hợp lý tại đây: github.com/bigmlcom/closchema - charleslparker
@Munhitsu Manatee.Json (.Net) hỗ trợ rộng rãi lược đồ JSON. - gregsdennis


Nếu bạn đang sử dụng Jackson làm trình phân tích cú pháp JSON của bạn thì đây là cách bạn bậ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 # bằng cách thiết lập:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);    

Nhưng nói chung (như đã trả lời trước đây) spec không cho phép bình luận.


51
2018-02-06 20:44



Mở liên kết đó đã hết thời gian chờ khi tôi thử: The connection to the server was reset while the page was loading. - Peter Mortensen