2016-07-24 8 views
0

Использование комментариев в файлах конфигурации JSON в Sublime Text может привести к невозможности декодирования объектов JSON. Вот моя история.Почему Sublime Text 3 позволяет комментировать файлы конфигурации JSON?

Я недавно установил плагин SublimeREPL в своем Sublime Text 3. Вскоре я обнаружил, что он запускал Python2.7 вместо 3.5 по умолчанию, поэтому я добавил свои собственные файлы конфигурации Python3.5 в соответствии с SublimeREPL Docs, чтобы он поддерживал Python3.5.

Моего Packages/SublimeREPL/config/Python3.5/Main.sublime-menu JSON файл конфигурация выглядит следующим образом:

[ 
{ 
    "id": "tools", 
    "children": 
    [{ 
     "caption": "SublimeREPL", 
     "mnemonic": "R", 
     "id": "SublimeREPL", 
     "children": 
     [ 
      {"caption": "Python3.5", 
      "id": "Python3.5", 

      "children":[ 
       {"command": "repl_open", 
       "caption": "Python3.5", 
       "id": "repl_python3.5", 
       "mnemonic": "P", 
       "args": { 
        "type": "subprocess", 
        "encoding": "utf8", 
        "cmd": ["python3", "-i", "-u"], 
        "cwd": "$file_path", 
        "syntax": "Packages/Python/Python.tmLanguage", 
        "external_id": "python3", 
        "extend_env": {"PYTHONIOENCODING": "utf-8"} 
        } 
       }, 
       // run files 
       {"command": "repl_open", 
       "caption": "Python3.5 - RUN current file", 
       "id": "repl_python3.5_run", 
       "mnemonic": "R", 
       "args": { 
        "type": "subprocess", 
        "encoding": "utf8", 
        "cmd": ["python3", "-u", "$file_basename"], 
        "cwd": "$file_path", 
        "syntax": "Packages/Python/Python.tmLanguage", 
        "external_id": "python3", 
        "extend_env": {"PYTHONIOENCODING": "utf-8"} 
        } 
       } 
      ]} 
     ] 
    }] 
}] 

Примечания есть комментарий // запускать файлы в этом файле. Эта конфигурация отлично работает из инструментов меню -> SublimeREPL-> Python3.5. Однако, когда я попытался связать клавишу F5 с repl_python3.5_run, чтобы иметь легкий доступ к 3,5, следующее исключение было брошено в консоли:

Traceback (most recent call last): 

    File "./python3.3/json/decoder.py", line 367, in raw_decode 
StopIteration 

During handling of the above exception, another exception occurred: 

Traceback (most recent call last): 

File "/opt/sublime_text/sublime_plugin.py", line 551, in run_ 
    return self.run(**args) 

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 32, in run 
    json_cmd = self._find_cmd(id, path) 

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 41, in _find_cmd 
    return self._find_cmd_in_file(id, file) 

File "/home/ubuntu/.config/sublime-text-3/Packages/SublimeREPL/run_existing_command.py", line 53, in _find_cmd_in_file 
    data = json.loads(bytes) 

File "./python3.3/json/__init__.py", line 316, in loads 

File "./python3.3/json/decoder.py", line 351, in decode 

File "./python3.3/json/decoder.py", line 369, in raw_decode 

ValueError: No JSON object could be decoded 

После того как я удалил // запускать файлы комментарий. Ключ F5 работает отлично. Это именно комментарий, который вызывает проблему. Sublime Text использует JSON в качестве конфигурационных файлов, множество конфигурационных файлов снабжаются // комментариями стиля. Как мы знаем, комментарии удаляются из JSON по дизайну.

Тогда как может возвышенный текст разрешить комментарии в конфигурационных файлах, использует ли он трубку? Если это так, как может сбой моего ключа?

+1

** P АРЕНДА НЕ ПОЧЕМУ ТЕКСТ КАК ИЗОБРАЖЕНИЯ **. Скопируйте и вставьте текст в свой вопрос. Изображения не доступны для поиска и не могут быть интерпретированы экранными программами для лиц с нарушениями зрения. Используйте ссылку [edit], чтобы изменить свой вопрос. См. [This] (http://meta.stackoverflow.com/a/285557/1426065) для получения дополнительной информации. – MattDMo

+0

Вы правы. Я уже исправил свою ошибку. Спасибо, что указали это. @ MattDMo – Naomi

ответ

2

сами (программа ядра, а не плагины, такие как SublimeREPL) использует внутреннюю библиотеку JSON для разбора конфигурационных файлов, таких как .sublime-settings, .sublime-menu, .sublime-build и т.д. Это (скорее всего настроено) анализатор позволяет комментарии Sublime.

Однако плагины запускаются через версию Python (в настоящее время 3.3.6 для сборки dev), связанную с исполняемым файлом Sublime plugin_host. Любой плагин, который импортирует json модуля из стандартной библиотеки (например, run_existing_command.py должен соблюдать ограничения этого модуля, и который включает в себя не в состоянии распознавать комментарии JavaScript-стиль, как // в формате JSON.

Один из способов, чтобы это было бы для импорта внешний модуль, такой как commentjson, который разделяет различные типы комментариев, включая //, перед передачей данных на стандартный модуль json. Поскольку это чистый модуль Python, вы можете просто скопировать каталог source в главный каталог SublimeREPL, а затем отредактировать run_existing_command.py соответственно - сменить линию 6 на import commentjson as json, и вы все настроены.

+0

В ST3 вы можете получить доступ к внутренней библиотеке и декодировать строку json с помощью функции 'sublime.decode_value (string)'. –

+0

@ r-stein интересный, я никогда раньше не смотрел на эту функцию. К сожалению, SublimeREPL, кажется, был оставлен некоторое время назад, и, хотя он все еще работает хорошо, шансы на какие-либо новые функции или исправления находятся между slim и none. – MattDMo

+0

Спасибо. Это звучит как интересное решение. Я дам ему шанс. @MattDMo – Naomi