最大的Adobe AS3 JSON字符串长度是多少?

5
我使用Java编写了Socket通信服务器和AS3编写的AIR程序,使用Socket连接进行通信。通过Socket连接进行通信是通过JSON序列化完成的。
有时候,当AS3代码收到特别长的JSON字符串时,会出现JSON解析错误。
每个JSON字符串我都以end字符串结尾,以便程序知道这不是消息的结尾,因此这不是AIR程序分段读取消息的问题。
该错误只出现在非常长的JSON字符串中,例如长度为78031的字符串。是否有JSON序列化的限制?

请注意,在 Flash Player 11 之前,我们使用外部库来进行 JSON 编码/解码。在 Flash 11 中,JSON 支持已内置到播放器中。您正在使用哪个版本? - Sunil D.
我已经使用过两种方法,但都出现了错误。现在我正在使用com.adobe.serialization.json.JSONDecoder。 - LokoTerrorita
一个解决方法是对你的JSON进行分页,将它在到达ActionScript之前分成块。 - ToddBFisher
2个回答

1

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

关键是,即使服务器没有发送所有数据,Flash ProgressEvent.SOCKET_DATA事件仍会触发,有些数据会被留下(特别是在数据很大且连接速度慢的情况下)。因此,像{"key":"value"}这样的数据会分成两个或多个部分,例如:{"key":"value"}。有时,您可能会在一条消息中接收到几个组合在一起的JSON,例如{"json1key":"value"}{"json2key":"value"} - 内置的Flash JSON解析器也无法处理这些情况。

为了解决这个问题,我建议您修改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
    }
}

0

根据Adobe的说法, 看起来你面临的不是JSON问题,而是Socket限制。

你可以通过writeUTF和readUTF方法发送到Socket的字符串最多只能有65,535个字节。这是因为该字符串会被附加一个16位无符号整数,而不是以空字符结尾的字符串。


我写道,我正在处理它。在JSON字符串末尾有一个唯一的字符串。 - LokoTerrorita
是的,这可能是真的。如果您在发送字符串之前没有正确拆分它,并在读取时附加,那么会导致数据丢失。 - Andreas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接