Мне потребовалось через RTMP рассылать данные в формате JSON по флешкам.
После прихода во флеш данные отправляются сразу в ExternalInterface.call:


ExternalInterface.call("juggernaut.receiveData", event.info.description);

В какой-то момент у меня начали валиться ошибки «в нигде» и «из
ниоткуда», которые
были видны только в Firebug-е. До receiveData дело не дошло.
Текст ошибки:


missing ) after argument list

Минимальный тест таков:


var s:String = "\"\\\"B\\\"\""; — это дважды экранированная строка "B"
 (кавычки входят в часть строки).
trace(s);
ExternalInterface.call("receiveData", s);

Дело оказалось вот в чём:

user_name Вася “Пупкин” превращалось в JSON


{"user" : {"id" : 15, "user_name" : "Вася \"Пупкин\""}}

Эта строка без изменений проходит по AMQP, RTMP и попадет в
event.info.description.

Сначала я решил, что проблема может быть где-то на выходе из флеша и
предположил, что дело в
яваскриптовой функции __flash__toXML


function __flash__escapeXML(s) {
       return s.replace(/&/g, "&amp;").replace(/</g,
"&lt;").replace(/>/g, "&gt;").replace(/"/g, "&quot;").replace(/'/g,
"&apos;");
}

Потом, обрезав всё до минимума и получив тот самый минимальный тест увидел:


try { __flash__toXML(r("\"\\"B\\"\"")) ; } catch (e) { "<undefined/>"; }

Т.е. __flash__toXML вызывается для обработки возвращаемых значений, а
вот входной JSON туда попадал прям как есть, без необходимого
экранирования.

Чтение http://code.google.com/p/doctype/wiki/ArticleFixingFlashExternalInterface
мне не помогло, так что решил проблему так:


var re:RegExp = /\\/g;
ExternalInterface.call("receiveData",
event.info.description.replace(re, "\\\\"));

Вроде работает.

UPD: Доп информация: http://www.develotec.com/flash8api.txt
xpost: http://habrahabr.ru/blogs/webdev/65708/

Sidebar