Можно ли использовать комментарии в формате JSON? - PullRequest
6607 голосов
/ 28 октября 2008

Могу ли я использовать комментарии внутри файла JSON? Если да, то как?

Ответы [ 47 ]

8 голосов
/ 19 июня 2018

JSON сам по себе не позволяет комментировать. Рассуждения совершенно глупы, потому что вы можете использовать сам JSON для создания комментариев, что полностью исключает рассуждения, и загружают пространство данных анализатора без всякой веской причины для точно тот же результат и потенциальные проблемы, такие как они: файл JSON с комментариями.

Если вы попытаетесь добавить комментарии (например, с помощью // или /* */ или #), то некоторые парсеры не будут работать, потому что это строго не в спецификации JSON. Таким образом, вы должны никогда делать это.

Вот, например, где моя система управления изображениями сохранила примечания к изображениям и некоторую базовую отформатированную (комментарий) информацию, относящуюся к ним (внизу):

{
    "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."
    }
}
8 голосов
/ 29 декабря 2015

Вы можете использовать JSON с комментариями, если вы загрузите его как текстовый файл, а затем удалите из него комментарии.

Для этого вы можете использовать библиотеку Разложение . Ниже приведен полный пример.

Ввод JSON (файл input.js):

/*
* multi-line comments
**/
{
    "value": 123 // one-line comment
}

Тестовое приложение:

var decomment = require('decomment');
var fs = require('fs');

fs.readFile('input.js', 'utf8', function (err, data) {
    if (err) {
        console.log(err);
    } else {
        var text = decomment(data); // removing comments
        var json = JSON.parse(text); // parsing JSON
        console.log(json);
    }
});

Выход:

{ value: 123 }

См. Также: глотание-разложение , grunt-разложение

7 голосов
/ 03 июля 2014

Я только что нашел " grunt-strip-json-comments ".

«Уберите комментарии из JSON. Это позволяет вам использовать комментарии в ваших JSON-файлах! »

{
    // Rainbows
    "unicorn": /* ❤ */ "cake"
}
7 голосов
/ 26 августа 2016

В моем случае мне нужно использовать комментарии для целей отладки до вывода структуры JSON. Поэтому я решил использовать отладочную информацию в заголовке HTTP, чтобы избежать взлома клиента:

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

Enter image description here

5 голосов
/ 19 июля 2014

Если ваш контекст - конфигурация Node.js, вы можете рассмотреть JavaScript через module.exports в качестве альтернативы JSON:

module.exports = {
    "key": "value",

    // And with comments!
    "key2": "value2"
};

Синтаксис require останется прежним. Будучи JavaScript, расширение файла должно быть .js.

5 голосов
/ 16 апреля 2017

Вы можете использовать простую предварительную обработку с помощью регулярных выражений. Например, следующая функция будет декодировать JSON с комментариями в PHP:

function json_decode_commented ($data, $objectsAsArrays = false, $maxDepth = 512, $opts = 0) {
  $data = preg_replace('~
    (" (?:[^"\\\\] | \\\\\\\\ | \\\\")*+ ") | \# [^\v]*+ | // [^\v]*+ | /\* .*? \*/
  ~xs', '$1', $data);

  return json_decode($data, $objectsAsArrays, $maxDepth, $opts);
}

Поддерживаются все комментарии в стиле PHP: / *, #, //. Строковые литералы сохраняются как есть.

5 голосов
/ 23 января 2019

Практический ответ для пользователей VSCode в 2019 году - использовать расширение 'jsonc'.

Практично, потому что это расширение, распознаваемое VSCode для обозначения "JSON с комментариями". Пожалуйста, дайте мне знать о других редакторах / IDE в комментариях ниже.

Было бы неплохо, если бы VSCode и другие редакторы также добавили нативную поддержку для 'json5', но сейчас VSCode включает только поддержку 'jsonc'.

(Я перебрал все ответы, прежде чем опубликовать это, и ни один не упомянул 'jsonc'.)

3 голосов
/ 08 декабря 2016

Да, вы можете иметь комментарии. Но я не буду рекомендовать любую причину, упомянутую выше.

Я провел некоторое исследование и обнаружил, что все требуемые методы JSON используют метод JSON.parse. Итак, я пришел к решению: мы можем переопределить или сделать исправление обезьян вокруг JSON.parse.

Примечание: проверено только на Node.js; -)

var oldParse = JSON.parse;
JSON.parse = parse;
function parse(json){
    json = json.replace(/\/\*.+\*\//, function(comment){
        console.log("comment:", comment);
        return "";
    });
    return oldParse(json)
}

Файл JSON:

{
  "test": 1
  /* Hello, babe */
}
3 голосов
/ 25 марта 2016

Если вы используете PHP, вы можете использовать эту функцию для поиска и удаления комментариев типа // / * из строки JSON перед анализом в объект / массив:

function json_clean_decode($json, $assoc = true, $depth = 512, $options = 0) {
       // search and remove comments like /* */ and //
       $json = preg_replace("#(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/)|([\s\t]//.*)|(^//.*)#", '', $json);

       if(version_compare(phpversion(), '5.4.0', '>=')) {
           $json = json_decode($json, $assoc, $depth, $options);
       }
       elseif(version_compare(phpversion(), '5.3.0', '>=')) {
           $json = json_decode($json, $assoc, $depth);
       }
       else {
           $json = json_decode($json, $assoc);
       }

       return $json;
   }

Надеюсь, это поможет!

3 голосов
/ 07 ноября 2015

Как уже указывалось во многих ответах, в JSON изначально нет комментариев. Конечно, иногда вы все равно хотите их. Для Python это можно сделать двумя способами: commentjson (# и // только для Python 2) или json_tricks (# или // для Python 2 и Python 3), который имеет несколько других функций. Отказ от ответственности: я сделал json_tricks.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...