Запуск аддона 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']"
?
Если это так, вы должны сообщить об ошибке.