json註解




可以在JSON中使用註釋嗎? (20)

JSON不支持評論。 它也從未打算用於需要註釋的配置文件。

Hjson是人類的配置文件格式。 輕鬆的語法,更少的錯誤,更多的評論。

有關JavaScript,Java,Python,PHP,Rust,Go,Ruby和C#庫的信息,請參閱hjson.org

我可以在JSON文件中使用註釋嗎? 如果是這樣,怎麼樣?


JSON本身不支持註釋,但您可以創建自己的解碼器或至少預處理器來刪除註釋,這非常好(只要您忽略註釋並且不使用它們來指導您的應用程序應如何處理JSON數據)。

JSON沒有評論。 JSON編碼器不得輸出註釋。 JSON解碼器可以接受和忽略註釋。

絕不應該使用註釋來傳輸任何有意義的內容。這就是JSON的用途。

Cf:Douglas Crockford,JSON規範的作者


JSON不是框架協議。它是一種無語言格式。因此,沒有為JSON定義註釋的格式。

正如許多人所建議的,有一些技巧,例如,重複鍵或_comment您可以使用的特定鍵。由你決定。


,JSON中不允許使用//…/*…*/形式的註釋。 這個答案基於:

  • http://www.json.org
  • RFC 4627 :JavaScript對象表示法的application/json媒體類型(JSON)
  • RFC 7159 JavaScript對象表示法(JSON)數據交換格式 - 已廢棄:4627,7158

JSON對配置文件和其他本地用法很有意義,因為它無處不在,因為它比XML簡單得多。

如果人們有充分的理由反對在傳遞數據時使用JSON進行評論(無論是否有效),那麼可能JSON可以分為兩部分:

  • JSON-COM:線上的JSON,或者在傳遞JSON數據時應用的規則。
  • JSON-DOC:JSON文檔,或文件或本地JSON。定義有效JSON文檔的規則。

JSON-DOC將允許註釋,並且可能存在其他微小差異,例如處理空白。解析器可以輕鬆地從一個規範轉換為另一個規範。

至於該plus.google.com/118095276221607585885/posts/RK8qyGVaGSr道格拉斯克羅克福德在這個問題上取得了(由@Artur Czajka參考)

假設您使用JSON來保留要註釋的配置文件。繼續,插入您喜歡的所有評論。然後通過JSMin將其傳遞給JSON解析器。

我們正在討論通用配置文件問題(跨語言/平台),他正在回答JS特定的實用程序!

當然,JSON特定的minify可以用任何語言實現,但是標準化,因此它在所有語言和平台的解析器中變得無處不在,所以人們不再浪費他們的時間缺乏這個功能,因為他們有很好的用例,查看問題在線論壇,並讓人們告訴他們這是一個壞主意或建議很容易實現從文本文件剝離評論。

另一個問題是互操作性。假設您有一個庫或API或任何類型的子系統,其中包含一些與之關聯的配置或數據文件。這個子系統可以從不同的語言訪問。然後你去告訴別人:順便說一下,在將它們傳遞給解析器之前,不要忘記從JSON文件中刪除註釋!


以下是我在Google Firebase文檔中找到的允許您在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"
}

免責聲明:您的保修是無效的

正如已經指出的那樣,這個hack利用了規範的實現。 並非所有JSON解析器都能理解這種JSON。 流式解析器尤其會窒息。

這是一個有趣的好奇心,但你真的不應該用它來做任何事情 。 以下是原始答案。

我發現了一個小的hack,它允許你將註釋放在一個不會影響解析的JSON文件中,或者改變以任何方式表示的數據。

看來,在聲明對象文字時,您可以使用相同的鍵指定兩個值,最後一個值優先。 信不信由你,事實證明JSON解析器的工作方式相同。 因此,我們可以使用它在源JSON中創建註釋,這些註釋不會出現在已解析的對象表示中。

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

如果我們應用此技術,您註釋的JSON文件可能如下所示:

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

上面的代碼是有效的JSON 。 如果你解析它,你會得到一個像這樣的對象:

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

這意味著沒有評論的痕跡,他們不會有奇怪的副作用。

快樂的黑客!


如果您使用Jackson作為JSON解析器,那麼這就是您啟用它以允許註釋的方式:

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

然後你可以有這樣的評論:

{
  key: "value" // Comment
}

您也可以通過設置以#開頭的評論:

mapper.configure(Feature.ALLOW_YAML_COMMENTS, true);

但總的來說(如前所述)規範不允許評論。


如果您的文本文件(即JSON字符串)將被某些程序讀取,那麼在使用之前刪除C或C ++樣式註釋有多難?

答:這將是一個班輪。 如果您這樣做,那麼JSON文件可以用作配置文件。


您應該編寫一個JSON模式 。 JSON模式目前是一個提議的Internet草案規範。 除了文檔,架構還可用於驗證您的JSON數據。

例:

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

您可以使用description schema屬性提供文檔。


抱歉,我們無法在JSON中使用註釋...請參閱JSON.org JSON語法圖。

Douglas Crockford說“ plus.google.com/118095276221607585885/posts/RK8qyGVaGSr ”:

我從JSON中刪除了註釋,因為我看到有人使用它們來保存解析指令,這種做法會破壞互操作性。 我知道缺乏評論會讓一些人感到悲傷,但事實並非如此。

假設您使用JSON來保留要註釋的配置文件。 繼續,插入您喜歡的所有評論。 然後通過JSMin將其傳遞給JSON解析器。


沒有。

JSON應該都是數據,如果你包含註釋,那麼它也將是數據。

您可以擁有一個名為"_comment" (或其他)的指定數據元素,這些元素將被使用JSON數據的應用程序忽略。

你可能會更好地在生成/接收JSON的進程中發表評論,因為他們應該事先了解JSON數據,或者至少知道它的結構。

但是如果你決定:

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

要將JSON項目切割成部分,我添加“虛擬註釋”行:

{

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

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

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

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

}

評論不是官方標準。 雖然一些解析器支持C風格的註釋。 我使用的是JsonCpp 。 在這些例子中有這樣一個:

// 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不驗證這一點。 因此,註釋是特定於解析器的擴展,而不是標準。

另一個解析器是JSON5

JSON TOML的替代品。


Dojo Toolkit JavaScript工具包(至少從1.4版本開始)允許您在JSON中包含註釋。評論可以是/* */格式。Dojo Toolkit通過dojo.xhrGet()調用消耗JSON 。

其他JavaScript工具包可能類似地工作。

在選擇最終選項之前嘗試使用備用數據結構(甚至數據列表)時,這會很有用。


JSON的作者希望我們在JSON中包含註釋,但在解析它們之前將它們刪除(參見Michael Burr提供的plus.google.com/118095276221607585885/posts/RK8qyGVaGSr)。如果JSON應該有註釋,為什麼不標準化它們,讓JSON解析器完成這項工作?我不同意那裡的邏輯,但是,唉,這是標準。使用其他人建議的YAML解決方案很好,但它需要庫依賴。

如果你想刪除註釋,但又不想擁有庫依賴,那麼這是一個兩行解決方案,適用於C ++風格的註釋,但可以適用於其他人:

var comments = new RegExp("//.*", 'mg');
data = JSON.parse(fs.readFileSync(sample_file, 'utf8').replace(comments, ''));

請注意,此解決方案只能用於可以確保JSON數據不包含註釋啟動器的情況,例如('//')。

實現JSON解析,刪除註釋以及沒有額外庫的另一種方法是在JavaScript解釋器中評估JSON。當然,使用這種方法的警告是,您只想評估無污染的數據(沒有不受信任的用戶輸入)。這是Node.js中這種方法的一個例子 - 另一個警告,下面的例子只會讀取一次數據,然後它將被緩存:

data = require(fs.realpathSync(doctree_fp));

如果您使用JSON5,則可以包含註釋。

JSON5是JSON的建議擴展,旨在使人們更容易手動編寫和維護。它通過直接從ECMAScript 5添加一些最小語法功能來實現此目的。


可以JSONP發表評論,但不能在純JSON中發表評論。我花了一個小時試圖讓我的程序使用Highcharts的這個例子:http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?://www.highcharts.com/samples/data/jsonp.php http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=? filename http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=? aapl-c.json&callback http://www.highcharts.com/samples/data/jsonp.php?filename=aapl-c.json&callback=?

如果你按照鏈接,你會看到

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

由於我在本地文件夾中有一個類似的文件,因此同源策略沒有問題,因此我決定使用純JSON ...當然,$.getJSON由於註釋而無法靜默失敗。

最後我只是向上面的地址發送了一個手動HTTP請求,並意識到內容類型是text/javascript,因此,JSONP返回純JavaScript。在這種情況下,允許評論。但我的應用程序返回內容類型application/json,所以我不得不刪除註釋。


有一個很好的解決方案(hack),它是有效的JSON。只需兩次(或更多)相同的密鑰。例如:

{
  "param" : "This is the comment place",
  "param" : "This is value place",
}

所以JSON會將其理解為:

{
  "param" : "This is value place",
}

這取決於您的JSON庫。Json.NET支持JavaScript風格的註釋/* commment */

請參閱另一個問題。





comments