最大as3 adobe JSON字符串长度

时间:2013-08-13 14:07:20

标签: java json actionscript-3 sockets air

我使用Socket连接编写了带有Java的Socket Communication服务器和带有AS3的AIR程序。 通过套接字连接的通信是通过JSON序列化完成的。

有时在套接字上存在很长的JSON串口,AS3代码表示存在JSON解析错误。

每个JSON字符串以 end 字符串结尾,让程序知道它不是消息的结尾,所以这不是AIR程序读取的问题部分信息。

只有realy long json字符串才会出现错误,例如,长度为78031的字符串。 JSON序列化是否有任何限制?

2 个答案:

答案 0 :(得分:0)

According to Adobe,您似乎没有遇到JSON问题,而是Socket限制。

您可以通过writeUTF通过Socket发送的字符串,而readUTF 受限于65,535字节。这是因为字符串前面加上16位无符号整数而不是空终止字符串。

答案 1 :(得分:0)

我遇到了同样的问题。问题出在Flash应用程序从套接字读取数据。

重点是Flash ProgressEvent.SOCKET_DATA事件即使在服务器没有发送所有数据时也会触发,并且还有一些事情(特别是当数据很大且连接很慢时)。 因此 {“key”:“value”} 之类的内容有两个(或更多)部分,例如: {“key”:“val ue” } 即可。有时候你可能会在一条消息中收到几个加入的JSON,比如 {“json1key”:“value”} {“json2key”:“value”} - 内置的Flash JSON解析器也无法处理这些。 / p>

为了解决这个问题,我建议你修改Flash应用程序中的SocketData处理程序,为接收到的字符串添加缓存。像这样:

// declaring vars
private var _socket:Socket;
private var _cache: String = "";

// adding EventListener
_socket.addEventListener(ProgressEvent.SOCKET_DATA, onSocketData);

private function onSocketData(e: Event):void
{
    // take the incoming data from socket
    var fromServer: ByteArray = new ByteArray;
    while (_socket.bytesAvailable)
    {
        _socket.readBytes(fromServer);
    }

    var receivedToString: String = fromServer.toString();
    _cache += receivedToString;

    if (receivedToString.length == 0) return;   // nothing to parse

    // convert that long string to the Vector of JSONs
    // here is very small and not fail-safe alghoritm of detecting separate JSONs in one long String
    var jsonPart: String = "";
    var jsonVector: Vector.<String> = new Vector.<String>;
    var bracketsCount: int = 0;
    var endOfLastJson: int = 0;

    for (var i: int = 0; i < _cache.length; i++)
    {
        if (_cache.charAt(i) == "{") bracketsCount += 1;
        if (bracketsCount > 0) jsonPart = jsonPart.concat(_cache.charAt(i));
        if (_cache.charAt(i) == "}")
        {
            bracketsCount -= 1;
            if (bracketsCount == 0)
            {
                jsonVector.push(jsonPart);
                jsonPart = "";
                endOfLastJson = i;
            }
        }
    }

    // removing part that isn't needed anymore 
    if (jsonVector.length > 0)
    {
        _cache = _cache.substr(endOfLastJson + 1);
    }

    for each (var part: String in jsonVector)
    {
        trace("RECEIVED: " + part); // voila! here is the full received JSON
    }
}