18842
19778
我可以在JSON文件中使用註釋嗎?如果是這樣,怎麼辦? 
1個
2
下一個
沒有。
JSON僅是數據,如果包含註釋,那麼它也將是數據。
您可能有一個名為“ _comment”(或其他名稱)的指定數據元素,使用JSON數據的應用程序應忽略該數據元素。
在生成/接收JSON的過程中添加註釋可能會更好,因為它們應該事先知道什麼是JSON數據,或者至少知道其結構。
但是,如果您決定:
{
“ _comment”:“評論文字在這裡...”,
“詞彙表”:{
“ title”:“詞彙表示例”,
“ GlossDiv”:{
“ title”:“ S”,
“ GlossList”:{
“ GlossEntry”:{
“ ID”:“ SGML”,
“ SortAs”:“ SGML”,
“ GlossTerm”:“標准通用標記語言”,
“首字母縮寫”:“ SGML”,
“ Abbrev”:“ ISO 8879:1986”,
“ GlossDef”:{
“ para”:“一種元標記語言,用於創建諸如DocBook之類的標記語言。”,
“ GlossSeeAlso”:[“ GML”,“ XML”]
},
“ GlossSee”:“標記”
}
}
}
}
}
|
不,JSON中不允許使用///…或/ *…* /形式的註釋。該答案基於:
https://www.json.org
RFC 4627:
JavaScript對象表示法(JSON)的application / json媒體類型
RFC 8259 JavaScript對象表示法(JSON)數據交換格式(取代RFC 4627、7158、7159)
|
如果選擇,請添加評論;在解析或傳輸之前,先用減法器將其剝離。
我剛剛發布了JSON.minify(),它從JSON塊中刪除了註釋和空格,並使之成為可以解析的有效JSON。因此,您可以像這樣使用它:
JSON.parse(JSON.minify(my_str));
當我發布它時,我什至遭到了人們的強烈反對,甚至對此想法也持反對態度,因此我決定寫一篇關於為什麼在JSON中有意義的博客文章。它包含JSON創建者的以下著名註釋:
假設您正在使用JSON保留要註釋的配置文件。繼續並插入您喜歡的所有評論。然後,將其通過JSMin傳遞給JSON分析器。 -道格拉斯·克羅克福德(Douglas Crockford),2012年
希望這對那些不同意JSON.minify()為何有用的人有所幫助。
|
根據設計,註釋已從JSON中刪除。
我從JSON中刪除了註釋,因為我看到人們正在使用它們保留解析指令,這種做法會破壞互操作性。我知道缺少評論會讓某些人感到難過,但事實並非如此。
假設您正在使用JSON保留要註釋的配置文件。繼續並插入您喜歡的所有評論。然後將其通過JSMin傳遞給JSON分析器。
資料來源:道格拉斯·克羅克福德(Douglas Crockford)關於Google+的公開聲明
|
JSON不支持註釋。也從來沒有打算將其用於需要註釋的配置文件。
Hjson是人類的配置文件格式。輕鬆的語法,更少的錯誤,更多的註釋。
有關JavaScript,Java,Python,PHP,Rust,Go,Ruby,C ++和C#庫的信息,請參見hjson.github.io。
|
免責聲明:您的保修無效
正如已經指出的那樣,這種黑客利用了規範的實現。並非所有JSON解析器都會理解這種JSON。流解析器尤其會阻塞。
這是一個有趣的好奇心,但是您真的不應該將它用於任何用途。以下是原始答案。
我發現了一個小技巧,可讓您在不影響解析的JSON文件中放置註釋,或以任何方式更改表示的數據。
似乎在聲明對象文字時,可以使用相同的鍵指定兩個值,最後一個優先。信不信由你,事實證明JSON解析器的工作方式相同。因此,我們可以使用它在源JSON中創建註釋,這些註釋將不會出現在已解析的對象表示中。
({a:1,a:2});
// =>對象{a:2}
Object.keys(JSON.parse('{“ a”:1,“ a”:2}'))。length;
// => 1
如果我們應用此技術,則您註釋的JSON文件可能如下所示:
{
“ api_host”:“ API服務器的主機名。您也可以指定端口。
“ api_host”:“ hodorhodor.com”,
“ retry_interval”:“重試失敗的API調用之間的間隔,以​​秒為單位”,
“ retry_interval”:10,
“ auth_token”:“身份驗證令牌。它可以在開發人員信息中心的“設置”下找到”,
“ auth_token”:“ 5ad0eb93697215bc0d48a7b69aa6fb8b”,
“ favorite_numbers”:“一個包含我歷史上最喜歡的數字的數組”,
“ favorite_numbers”:[19,13,53]
}
上面的代碼是有效的JSON。如果您解析它,將得到一個這樣的對象:
{
“ api_host”:“ hodorhodor.com”,
“ retry_interval”:10,
“ auth_token”:“ 5ad0eb93697215bc0d48a7b69aa6fb8b”,
“收藏夾編號”:[19,13,53]
}
這意味著沒有評論的痕跡,並且它們不會有怪異的副作用。
駭客駭客!
|
考慮使用YAML。它幾乎是JSON的超集(幾乎所有有效的JSON都是有效的YAML),並且允許註釋。
|
你不能至少快速瀏覽一下json.org是我的經驗。
JSON有其語法在該頁面上可視化。關於評論沒有任何註釋。
|
註釋不是官方標準,儘管某些解析器支持C ++樣式的註釋。我使用的一個是JsonCpp。在示例中有一個:
//配置選項
{
//文字的默認編碼
“ encoding”:“ UTF-8”,
//在啟動時加載插件
“插件”:[
“蟒蛇”,
“ c ++”,
“紅寶石”
],
//製表符縮進大小
“ indent”:{“ length”:3,“ use_space”:true}
}
jsonlint不會對此進行驗證。因此,註釋是解析器特定的擴展,而不是標準的。
另一個解析器是JSON5。
JSON TOML的替代方法。
另一個選擇是jsonc。
最新版本的nlohmann / json具有可選支持,可忽略對解析的註釋。
|
您應該改為編寫JSON模式。 JSON模式是當前提議的Internet草案規範。除了文檔之外,該模式還可以用於驗證JSON數據。
例:
{
“ description”:“一個人”,
“ type”:“對象”,
“屬性”:
{
“名稱”:
{
“ type”:“ string”
},
“年齡”:
{
“ type”:“整數”,
“最大”:125
}
}
}
您可以通過使用描述架構屬性來提供文檔。
|
如果您將Jackson用作JSON解析器,則可以通過以下方式啟用它以允許註釋:
ObjectMapper映射器=新的ObjectMapper()。configure(Feature.ALLOW_COMMENTS,true);
然後,您可以有如下評論:
{
鍵:“值” //註釋
}
您還可以通過設置以下內容以#開頭的註釋:
mapper.configure(Feature.ALLOW_YAML_COMMENTS,true);
但是總的來說(如前所述),該規範不允許發表評論。
|
這是我在Google Firebase文檔中找到的內容,可讓您將註釋放入JSON:
{
“ //”:“某些瀏覽器將使用它來啟用推送通知。”,
“ //”:“所有項目都相同,這不是您項目的發件人ID”,
“ gcm_sender_id”:“ 1234567890”
}
|
沒有。 JSON曾經支持註釋,但是它們被濫用並從標準中刪除。
來自JSON的創建者:
我從JSON中刪除了註釋,因為我看到人們正在使用它們保留解析指令,這種做法會破壞互操作性。我知道缺少評論會讓某些人感到難過,但事實並非如此。 -道格拉斯·克羅克福德(Douglas Crockford),2012年
官方JSON網站位於JSON.org。 JSON被ECMA International定義為標準。總有一個請願程序來修改標準。由於多種原因,註釋不太可能被添加到JSON標準中。
通過設計,JSON是XML的一種易於反向工程(人工分析)的替代方案。甚至簡化到不需要註釋的地步。它甚至不是標記語言。目標是穩定和互操作性。
任何了解面向對象的“具有”關係的人都可以理解任何JSON結構-這就是重點。它只是帶有節點標籤(鍵/值對)的有向無環圖(DAG),這是一種幾乎通用的數據結構。
唯一需要的註釋可能是“ //這些是DAG標籤”。關鍵字名稱可以根據需要提供豐富的信息,從而允許任意語義上的統一。
任何平台都可以僅用幾行代碼來解析JSON。 XML需要復雜的OO庫,這些庫在許多平台上都不可行。
註釋只會使JSON的互操作性降低。除非您真正需要的是標記語言(XML),否則根本就沒有其他要添加的內容,並且不必關心持久數據是否易於解析。
但是作為JSON的創建者,也觀察到,一直有JS管道支持註釋:
繼續並插入您喜歡的所有評論。
然後將其通過JSMin傳遞給JSON分析器。 -道格拉斯·克羅克福德(Douglas Crockford),2012年
|
如果您的文本文件(它是JSON字符串)將由某個程序讀取,那麼在使用它之前剝離出C或C ++樣式的註釋會有多困難?
答:那將是一個班輪。如果這樣做,則可以將JSON文件用作配置文件。
|
如果您將Newtonsoft.Json庫與ASP.NET一起使用來讀取/反序列化,則可以在JSON內容中使用註釋:
//“ name”:“ string”
//“ id”:int
要么
/* 這是一個
評論示例* /
PS:單行註釋僅在6+版本的Newtonsoft Json中受支持。
對於那些想不開箱即用的人的補充說明:我將JSON格式用於我製作的ASP.NET Web應用程序中的基本設置。我閱讀了文件,並使用Newtonsoft庫將其轉換為設置對象,並在必要時使用它。
我更喜歡在JSON文件本身中編寫有關每個設置的註釋,只要我使用的庫可以,我就真的不在乎JSON格式的完整性。
我認為這比創建單獨的“ settings.README”文件並解釋其中的設置“更易於使用/理解”。
如果您對這種用法有疑問;抱歉,精靈沒電了。人們會發現其他用途JSON格式,您無能為力。
|
JSON背後的想法是提供應用程序之間的簡單數據交換。這些通常是基於Web的,並且語言是JavaScript。
它實際上並不允許這樣的註釋,但是,儘管將數據顯然需要解析代碼特別地忽略或處理,但將註釋作為數據中的名稱/值對之一傳遞肯定會起作用。
綜上所述,JSON文件不應該包含傳統意義上的註釋。它應該只是數據。
請訪問JSON網站以獲取更多詳細信息。
|
JSON本身不支持註釋,但是您可以使用自己的解碼器或至少預處理器來剝離註釋,這非常好(只要您只是忽略註釋並且不使用它們來指導您的應用程序應如何處理JSON數據)。
JSON沒有評論。 JSON編碼器不得輸出註釋。
JSON解碼器可以接受和忽略註釋。
註釋絕不能用於傳達任何有意義的內容。那是
JSON是做什麼的。
cf:JSON規範的作者Douglas Crockford。
|
我只是在配置文件中遇到此問題。我不想使用XML(冗長,圖形化,醜陋,難以閱讀)或“ ini”格式(無層次結構,沒有真正的標準等)或Java“屬性”格式(如.ini)。
JSON可以完成他們所能做的一切,但是它的冗長程度更低,更易被人閱讀-並且解析器在許多語言中都很容易實現。這只是一棵數據樹。但是帶外註釋通常是記錄“默認”配置等的必要條件。配置絕不能是“完整文檔”,而可以是需要時人類可讀的保存數據樹。
我猜一個人可以為“有效” JSON使用“#”:“ comment”。
|
這取決於您的JSON庫。 Json.NET支持JavaScript樣式的註釋,/ *註釋* /。
請參閱另一個堆棧溢出問題。
|
JSON對於配置文件和其他本地用法很有意義,因為它無處不在,並且比XML更簡單。
如果人們在交換數據時(無論是否有效)有強烈的理由反對在JSON中添加註釋,則可以將JSON分為兩種:
JSON-COM:在線上的JSON,或在傳遞JSON數據時適用的規則。
JSON-DOC:JSON文檔,或文件中或本地的JSON。定義有效JSON文檔的規則。
JSON-DOC將允許註釋,並且可能存在其他細微差別,例如處理空格。解析器可以輕鬆地從一種規格轉換為另一種規格。
關於道格拉斯·克羅克福德(Douglas Crockford)在此問題上的評論(@Artur Czajka引用)
假設您正在使用JSON保留要註釋的配置文件。繼續並插入您喜歡的所有評論。然後將其通過JSMin傳遞給JSON分析器。
我們正在談論一個通用的配置文件問題(跨語言/跨平台),而他正在使用JS特定實用程序來回答!
確保可以用任何語言實現特定於JSON的minify,
但是對此進行了標準化,以使其在所有語言和平台的解析器中無處不在,因此人們不再浪費時間缺少該功能,因為他們有很好的用例,在在線論壇上查找問題,並讓人們告訴他們這是一個壞主意或建議很容易實現從文本文件中剝離註釋。
另一個問題是互操作性。假設您有一個庫或API或任何類型的子系統,並且其中有一些與之關聯的配置或數據文件。這個子系統是
可以從不同的語言訪問。那你要告訴別人:順便說一句
不要忘記在將註釋傳遞給解析器之前從JSON文件中刪除註釋!
|
如果您使用JSON5,​​則可以包含註釋。
JSON5是對JSON的擬議擴展,旨在使人類更輕鬆地手工編寫和維護。它通過直接從ECMAScript 5添加一些最小語法功能來實現此目的。
|
Dojo Toolkit JavaScript工具箱(至少從1.4版開始)允許您在JSON中包含註釋。註釋可以是/ * * /格式。 Dojo Toolkit通過dojo.xhrGet()調用使用JSON。
其他JavaScript工具包可能也可以類似地工作。
在選擇最終選項之前嘗試使用備用數據結構(甚至數據列表)時,這可能會有所幫助。
|
JSON不是框架協議。這是一種無語言格式。因此,未為JSON定義註釋的格式。
正如許多人所建議的那樣,有一些技巧,例如,可以使用重複鍵或特定鍵_comment。由你決定。
|
您可以在JSONP中添加註釋,但不能在純JSON中添加註釋。我只花了一個小時就試圖使我的程序在Highcharts中使用此示例:http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?
如果您點擊鏈接,將會看到
?(/ * AAPL來自Google Finance API的歷史OHLC數據* /
[
/ * 2006年5月* /
[1147651200000,67.79],
[1147737600000,64.98],
...
[1368057600000,456.77],
[1368144000000,452.97]
]);
由於我的本地文件夾中有一個類似的文件,因此同源策略沒有問題,所以我決定使用純JSON ...,當然,由於註釋,$。getJSON會自動失敗。
最終,我只是向上面的地址發送了一個手動HTTP請求,並意識到內容類型是text / javascript,因為JSONP返回的是純JavaScript。在這種情況下,允許註釋。但是我的應用程序返回了內容類型application / json,因此我不得不刪除註釋。
|
這是一個“可以嗎”的問題。這是一個“是”的答案。
不,您不應該使用重複的對象成員將旁通道數據填充到JSON編碼中。 (請參閱RFC中的“對象內的名稱應唯一”)。
是的,您可以在JSON周圍插入註釋,然後將其解析出來。
但是,如果您想要一種將任意的旁通道數據插入和提取到有效JSON的方法,這是一個答案。我們利用JSON編碼中數據的非唯一表示形式。 RFC第二節“在六個結構字符中的任何一個之前或之後都允許空白”下是允許*的。
* RFC僅聲明“在六個結構字符中的任何一個之前或之後允許空白”,沒有明確提及字符串,數字,“ false”,“ true”和“ null”。在所有實現中都會忽略此遺漏。
首先,通過縮小規範化JSON:
$ jsonMin = json_encode(json_decode($ json));
然後將您的評論編碼為二進制:
$ hex = unpack('H *',$ comment);
$ commentBinary = base_convert($ hex [1],16,2);
然後隱藏您的二進製文件:
$ steg = str_replace('0','',$ commentBinary);
$ steg = str_replace('1',“ \ t”,$ steg);
這是您的輸出:
$ jsonWithComment = $ steg。 $ jsonMin;
|
免責聲明:這很愚蠢
實際上,有一種添加註釋並保持在規範內的方法(無需其他解析器)。但是,如果不進行任何形式的解析,它將不會導致人類可讀的註釋。
您可能會濫用以下內容:
在任何令牌之前或之後都可以使用無關緊要的空格。
空格是以下一個或多個代碼的任何序列
點數:字符列表(U + 0009),換行符(U + 000A),回車
返回(U + 000D)和空格(U + 0020)。
您可以濫用這種方式添加評論。例如:用標籤開始和結束您的評論。在base3中編碼註釋,並使用其他空格字符表示它們。例如。
010212 010202 011000 011000 011010 001012 010122 010121 011021 010202 001012 011022 010212 011020 010202 010202
(您好,以ASCII為基數的三位)但不是0使用空格,而是1使用換行,2使用回車。
這只會給您留下很多不可讀的空格(除非您製作一個IDE插件來對其進行實時編碼/解碼)。
由於明顯的原因,我什至從未嘗試過,您也不應該嘗試。
|
JSON本身不允許評論。推理是完全愚蠢的,因為您可以使用JSON本身創建註釋,從而完全避免推理,並且完全沒有理由完全加載解析器數據空間,因為它們的結果和潛在問題完全相同,例如:JSON帶有註釋的文件。
如果您嘗試放入註釋(例如使用//或/ * * /或#),則某些解析器將失敗,因為嚴格來說這不是
在JSON規範中。因此,您絕對不要那樣做。
例如,在這裡,我的圖像處理系統保存了圖像符號和一些與它們有關的基本格式化(註釋)信息(在底部):
{
“符號”:[
{
“ anchorX”:333,
“ anchorY”:265,
“ areaMode”:“橢圓”,
“ extentX”:356,
“ extentY”:294,
“不透明度”:0.5,
“ text”:“頂部的橢圓區域”,
“ textX”:333,
“ textY”:265,
“ title”:“註釋1”
},
{
“ anchorX”:87,
“ anchorY”:385,
“ areaMode”:“矩形”,
“ extentX”:109,
“ extentY”:412,
“不透明度”:0.5,
“ text”:“區域\非底部”,
“ textX”:98,
“ textY”:385,
“ title”:“註釋2”
},
{
“ anchorX”:69,
“ anchorY”:104,
“ areaMode”:“多邊形”,
“ extentX”:102,
“ extentY”:136,
“不透明度”: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”:“簡單多邊形”,
“ textX”:85,
“ textY”:104,
“ title”:“註釋3”
}
],
“ imageXW”:512,
“ imageYW”:512,
“ imageName”:“ lena_std.ato”,
“ tinyDocs”:{
“ c01”:“ JSON圖像符號數據:”,
“ c02”:“ -------------------------”,
“ c03”:“”,
“ c04”:“此數據包含圖像符號和相關區域”,
“ c05”:“選擇信息,為某人提供手段”,
“ c06”:“圖像庫以橢圓顯示符號,”,
“ c07”:“矩形,多邊形或手繪區域指示”,
“ c08”:“在顯示給畫廊訪客的圖像上。”,
“ c09”:“”,
“ c10”:“ X和Y位置都在圖像中空間。圖片”,
“ c11”:“分辨率指定為imageXW和imageYW,其中”
“ c12”:“您經常將符號區域縮放到適當的比例,”
“ c13”:“圖像顯示的位置和大小,”,
“ c14”:“不管規模。”,
“ c15”:“”,
“ c16”:“對於橢圓,錨點是橢圓的中心,”,
“ c17”:“和範圍分別是X和Y半徑。”,
“ c18”:“”,
“ c19”:“對於矩形,錨點位於左上角,”,
“ c20”:“範圍在右下角。”,
“ c21”:“”,
“ c22”:“對於徒手和多邊形區域模式,為pointList”,
“ c23”:“包含一系列編號的XY點。如果是該區域,
“ c24”:“已關閉,最後一點將與”相同,“
“ c25”:“首先,所以您只需要考慮繪圖”,
“ c26”:“列表中各點之間的線。錨點和範圍”,
“ c27”:“設置為所指示的左上方和右下方”,
“ c28”:“區域,並且可以用作簡單的矩形”,
“ c29”:“檢測這些類型上的鼠標懸停位置”,
“ c30”:“區域。”,
“ c31”:“”,
“ c32”:“ textx和texty位置提供基本定位”,
“ c33”:“可幫助您找到文本信息的信息”,
“ c34”:“在與該區域相關的合理位置”,
“ c35”:“指示”,
“ c36”:“”,
“ c37”:“不透明度是介於0和1之間的值,其中.5表示”,
“ c38”:“ 50%的不透明背景,而1.0則表示完全不透明”,
“ c39”:“背景。建議繪製區域”,
“ c40”:“僅當用戶將指針懸停在圖像上時,”,
“ c41”:“並且繪製與區域關聯的文本”,
“ c42”:“僅當用戶將指針懸停在指示的上方時,”
“ c43”:“區域。”
}
}
|
我們正在為項目使用strip-json-comments。它支持類似:
/ *
*說明
* /
{
// 彩虹
“獨角獸”:/ *❤* /“蛋糕”
}
只需npm install --save strip-json-comments即可安裝和使用它,如下所示:
var strip_json_comments = require('strip-json-comments')
var json ='{/ *彩虹* /“ unicorn”:“ cake”}';;
JSON.parse(strip_json_comments(json));
// => {unicorn:'蛋糕'}
|
就我而言,我需要在輸出JSON結構之前使用註釋進行調試。因此,我決定在HTTP標頭中使用調試信息,以避免破壞客戶端:
header(“ My-Json-Comment:是的,我知道這是一種解決方法;-)”);
|
要將JSON項目切成幾部分,請添加“虛擬評論”行:
{
“#############################“ : “第1部分”,
“ data1”:“ value1”,
“ data2”:“ value2”,
“#############################“ : “第2部分”,
“ data4”:“ value3”,
“ data3”:“ value4”
}
|
1個
2
下一個
高度活躍的問題。贏得10個聲譽才能回答這個問題。信譽要求有助於保護該問題免受垃圾郵件和非答復活動的侵害。
不是您要找的答案?瀏覽其他標記有json註釋的問題,或提出您自己的問題。