【问题标题】:Maximum as3 adobe JSON string length最大 as3 adobe JSON 字符串长度
【发布时间】:2013-08-15 04:53:05
【问题描述】:

我用 Java 编写了 Socket 通信服务器,用 AS3 编写了一个 AIR 程序,使用 Socket 连接。 通过socket连接的通信是通过JSON序列化完成的。

有时通过套接字传输很长的 JSON 字符串,AS3 代码会显示 JSON 解析错误。

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

只有非常长的 json 字符串才会出现该错误,例如长度为 78031 的字符串。 JSON序列化有什么限制吗?

【问题讨论】:

  • 请注意,在 Flash Player 11 之前,我们使用外部库来进行 JSON 编码/解码。在 Flash 11 中,播放器内置了 JSON 支持。你用的是哪个?
  • 我都用过。两者都在抛出错误。现在我正在使用 com.adobe.serialization.json.JSONDecoder
  • 一种解决方法是对 JSON 进行分页,在到达 actionscript 之前将其分解为块。

标签: java json actionscript-3 sockets air


【解决方案1】:

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

关键是即使服务器没有发送所有数据,Flash ProgressEvent.SOCKET_DATA 事件也会触发,并留下一些东西(尤其是当数据很大并且连接很慢时)。 所以像 {"key":"value"} 这样的东西有两个(或更多)部分,比如: {"key":"val 和 ue" }。此外,有时您可能会在一条消息中收到多个连接的 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
    }
}

【讨论】:

    【解决方案2】:

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

    您可以通过 writeUTF 和 readUTF 通过 Socket 发送的字符串 限制为 65,535 个字节。这是因为字符串前面有一个 16 位无符号整数,而不是一个以空字符结尾的字符串。

    【讨论】:

    • 我写道,我正在处理它。我在 json 字符串的末尾有唯一的字符串
    • 是的,这可能是真的。如果发送前没有正确拆分字符串,读取时追加,会导致数据丢失。
    猜你喜欢
    • 2016-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2016-05-03
    • 1970-01-01
    • 2018-11-11
    • 2011-08-26
    相关资源
    最近更新 更多