php / as3正则表达式将多个json分成一个

时间:2010-05-05 13:43:19

标签: php regex actionscript-3 json

例如,我有2个json对象的字符串:

  

{“词汇表”:{“title”:“example glossary”},“aaa”:“1212”} {“adada”:“faka”}

我想将它拆分为PHP和Actionscript 3的数组

Array ( 
[0] => '{"glossary": {"title": "example glossary"}', 
[1] => '{"adada": "faka"}' 
)

最好的方法是什么。

编辑:

我不需要回答如何解析json。为了简化我需要拆分

  

{... {..} ....} {....} {........}

  

{... {..} ....}

     

{....}

     

{........}

4 个答案:

答案 0 :(得分:2)

你可以修改一个JSON解析器,就像Amargosh建议的那样,或者你可以为你做一个简单的算法,跳过字符串和注释,并跟踪开放的大括号。如果没有打开大括号,那么你就有了一个完整的值。重复它直到你没有输入。

然而我的建议是尝试通过与负责该输出的人交谈并说服他生成有效的JSON([{"glossary": {"title": "example glossary"}, "aaa": "1212"},{"adada": "faka"}]

来解决问题。

编辑:要分隔JSON对象,您需要为每个JSON对象添加一个长度前缀(4个字节就足够了)。然后你读掉插座,直到你有适量的字符。下一个字符将再次是下一个对象的长度。你必须这样做,因为TCP在数据包中工作。您不仅可以在一个数据包中拥有多个JSON对象,而且可以在两个数据包之间分配一个JSON对象。

另外,有几条建议:

  • 不要将PHP用于套接字服务器。它不是为此而做的。看看Haxe,特别是neko后端。
  • 除非你真的需要,否则不要自己写这类东西。这是无聊和愚蠢的工作。几乎有数百万个套接字服务器解决方案。你还应该看看Haxe remoting,它允许在例如{...}之间进行透明通信。一个Flash客户端和一个neko套接字服务器。另外,请看一下smartfox和red5。

edit2:你低估了问题并且你的做法并不好。你应该建立一个强大的解决方案,所以当你想通过网络发送数组时,你就不会有完全崩溃,因为你的“拆分器”中断了,或者你的JSON解析器输入了不完整的对象,因为只有一半的对象被读取。您可以轻松完成您想要做的事情:使用"}{"拆分输入,将"}"追加到除最后一个元素之外的任何元素,并将"{"添加到除第一个元素之外的任何元素。尽管如此,我强烈建议你不要采用这种方法,因为你会后悔。如果你真的认为你应该自己这样思考,那么试着至少做正确的事。

答案 1 :(得分:2)

很抱歉发布一个旧问题,但我在搜索类似问题时遇到了这个问题,我认为我对问题中定义的特定问题有一个非常简单的小解决方案。

// Convert original data to valid JSON array
$json = '['.str_replace('}{', '},{', $originalData).']';
$array = json_decode($json, true);

$arrayOfJsonStrings = array();
foreach ($array as $data) {
    $arrayOfJsonStrings[] = json_encode($data);
}
var_dump($arrayOfJsonStrings);

我认为只要您的JSON数据不包含可能包含'} {'。

的字符串,这就应该有效。

答案 2 :(得分:1)

正则表达式无法处理它。如果您实际上不需要JSON解析器,那么编写一个简单的解析函数就可以了。

这样的事情可以做到:

function splitJSONString($json) {
    $objects = array();

    $depth = 0;
    $current = '';

    for ($i = 0; $char = substr($json, $i, 1); $i++) {
        $current .= $char;

        if ($char == '{') {
            $depth += 1;
        } else if ($char == '}' && $depth > 0) {
            $depth -= 1;

            if ($depth == 0) {
                array_push($objects, $current);
                $current = '';
            }
        }           
    }

    return $objects;
}

答案 3 :(得分:0)

正则表达式不是正确的工具 - 使用JSON Parser