comments json註解 - 可以在JSON中使用註釋嗎?





(25)


以下是我在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"
}

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




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

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

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

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




可以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,所以我不得不刪除註釋。




嘆。為什麼不直接添加字段,例如

{
    "note1" : "This demonstrates the provision of annotations within a JSON file",
    "field1" : 12,
    "field2" : "some text",

    "note2" : "Add more annotations as necessary"
}

只需確保您的“notex”名稱不與任何真實字段衝突。




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

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

所以JSON會將其理解為:

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



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

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




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

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

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




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

請參閱另一個問題。




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

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

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

Cf:Douglas Crockford,JSON規範的作者




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

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




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

{

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

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

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

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

}



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

例:

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

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




評論已從JSON中刪除。

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

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

資料來源: plus.google.com/118095276221607585885/posts/RK8qyGVaGSr




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

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




JSON背後的想法是在應用程序之間提供簡單的數據交換。 這些通常是基於Web的,語言是JavaScript。

它並不真正允許這樣的註釋,但是,將註釋作為數據中的一個名稱/值對傳遞肯定會起作用,儘管顯然需要忽略該數據或由解析代碼專門處理。

總而言之,JSON文件不應該包含傳統意義上的註釋。 它應該只是數據。

有關更多詳細信息,請查看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你的二進製文件:

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

這是你的輸出:

$jsonWithComment = $steg . $jsonMin;



我們正在使用strip-json-comments我們的項目。它支持以下內容:

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

只需npm install --save strip-json-comments安裝和使用它,如:

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



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

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

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




如果您選擇,請附上評論; 在解析或傳輸之前用縮小器將它們剝離。

我剛剛發布了JSON.minify() ,它從JSON塊中刪除了註釋和空格,並使其成為可以解析的有效JSON。 所以,您可以使用它:

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

當我發布它時,我得到了一個強烈反對,甚至不同意它的想法,所以我決定寫一篇關於為什麼評論在JSON中有意義的綜合博客文章。 它包括來自JSON創建者的這個值得注意的評論:

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

希望這對那些不同意JSON.minify()可能有用的人有幫助。




你不能。 至少這是我從JSON.org快速瀏覽一下的JSON.org

JSON的語法在該頁面上可視化。 關於評論沒有任何說明。




我剛剛遇到配置文件。 我不想使用XML (冗長,圖形,醜陋,難以閱讀)或“ini”格式(沒有層次結構,沒有真正的標準等)或Java“屬性”格式(如.ini)。

JSON可以做他們能做的所有事情,但它更簡潔,更人性化 - 解析器在許多語言中都很容易和無處不在。 它只是一棵數據樹。 但是,帶外註釋通常是記錄“默認”配置等的必要條件。 配置永遠不是“完整文檔”,而是保存數據的樹,在需要時可以是人類可讀的。

我想可以使用"#": "comment" ,用於“有效”的JSON。




評論不是官方標準。 雖然一些解析器支持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的替代品。




沒有。

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



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

正如已經指出的那樣,這個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]
}

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

快樂的黑客!




你的data.json應該是這樣的:

{
 "maps":[
         {"id":"blabla","iscategorical":"0"},
         {"id":"blabla","iscategorical":"0"}
        ],
"masks":
         {"id":"valore"},
"om_points":"value",
"parameters":
         {"id":"valore"}
}

你的代碼應該是:

import json
from pprint import pprint

with open('data.json') as data_file:    
    data = json.load(data_file)
pprint(data)

請注意,這只適用於Python 2.6及更高版本,因為它取決於with-statement 。 在Python 2.5中,使用from __future__ import with_statement ,在Python <= 2.4中,請參閱Justin Peel的答案 ,該答案基於此。

您現在也可以像這樣訪問單個值:

data["maps"][0]["id"]  # will return 'blabla'
data["masks"]["id"]    # will return 'valore'
data["om_points"]      # will return 'value'




json comments