Запуск аддона Firefox завершается с ошибкой синтаксиса, когда JSON экранируется в package.json

Я делаю аддон Firefox (SDK/Jetpack) и использую модуль Simple-Prefs. Я хочу иметь массив в одном из моих предпочтений, поэтому в моем package.json я написал его как

{
  [...]
  "preferences":[
  [...]
  {
    "name":"audio-priority",
    "title":"Audio Priority",
    "type":"string",
    "value":"[\"audio-notifications\",\"audio-error\",\"audio-messages\",\"audio-youtube\",\"audio-twitch\"]",
    "hidden":true
  },
  [...]
}

Но когда я запускаю его, он строит и браузер открывается, но в консоли появляется

console.error: ltt-notifier: 
  Message: SyntaxError: missing ) after argument list
  Stack:
    evaluate@resource://gre/modules/XPIProvider.jsm -> jar:file:///tmp/tmpn5QUOo.mozrunner/extensions/jid1-23jjnBCWPFQ3ag@jetpack.xpi!/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js:223
setDefaultPrefs@resource://gre/modules/XPIProvider.jsm -> jar:file:///tmp/tmpn5QUOo.mozrunner/extensions/jid1-23jjnBCWPFQ3ag@jetpack.xpi!/bootstrap.js -> resource://gre/modules/commonjs/toolkit/loader.js -> resource://gre/modules/commonjs/sdk/addon/runner.js:66

И потом вся нагрузка (стек), и аддон не работает. Если я изменяю массив на что-либо, в котором нет символа \" (или любых экранированных символов - вместо этого я попытался использовать \u0022), он работает нормально, что заставляет меня думать, что это может быть ошибка Mozilla, но, вероятно, это моя ошибка,

2 ответа

Решение

Основываясь на ссылках с https://bugzilla.mozilla.org/show_bug.cgi?id=501156 (которые ссылаются на https://groups.yahoo.com/neo/groups/json/conversations/topics/1286) я понял что ответ должен быть

"[\\\"audio-notifications\\\",\\\"audio-error\\\",\\\"audio-messages\\\",\\\"audio-youtube\\\",\\\"audio-twitch\\\"]",

потому что в первый раз, когда JSON декодируется, он освобождает \"до", но JSON требует, чтобы он все еще был \". Экранируя \, а также", при первом анализе, когда обрабатывается весь файл, это превращается в

[\"audio-notifications\",\"audio-error\",\"audio-messages\",\"audio-youtube\",\"audio-twitch\"]

Который больше не закрывает кавычки (что, как я полагаю, было проблемой, потому что ошибка связана с командой оценки в собственном коде), и означает, что он все равно будет действительным JSON, когда он будет декодирован.

Это работает, если вы делаете

'["audio-notifications","audio-error","audio-messages","audio-youtube","audio-twitch"]'

или же

"['audio-notifications','audio-error','audio-messages','audio-youtube','audio-twitch']"?

Если это так, вы должны сообщить об ошибке.

Другие вопросы по тегам