【问题标题】:php/as3 regex to split multiple json in onephp/as3 正则表达式将多个 json 拆分为一个
【发布时间】:2011-02-15 22:52:09
【问题描述】:

例如,我有这个由 2 个 json 对象组成的字符串:

{“词汇表”:{“标题”:“示例词汇表”},“aaa”:“1212”}{“adada”:“faka”}

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

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

最好的方法是什么。

编辑:

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

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

进入

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

{....}

{........}

【问题讨论】:

    标签: php regex actionscript-3 json


    【解决方案1】:

    您可以按照 Amargosh 的建议修改 JSON 解析器来执行此操作,或者您可以制作一个简单的算法来为您执行此操作,跳过字符串和 cmets 并跟踪开括号。当没有左大括号时,你就有了一个完整的值。重复它,直到你没有输入。

    但是我的建议是尝试通过与负责该输出的人交谈并说服他生成有效的 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 解析器被输入了不完整的对象,因为只有一半的对象被读取.你想做的事情很容易做到:使用"}{"拆分输入,将"}"附加到除最后一个元素之外的任何元素,并将"{"添加到除第一个元素之外的任何元素。尽管如此,我强烈建议您不要使用这种方法,因为在某些时候您会后悔。如果你真的认为你应该自己做这些想法,那么至少试着把它们做对。

    【讨论】:

    • 我需要拆分它,因为我正在编写一个 php 套接字服务器,有时在一个缓冲区中我得到 2 个 json(由于某种原因合并,当我尝试快速发送几个命令时会发生这种情况同时)。
    【解决方案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 数据不包含可能包含“}{”的字符串,这应该可以工作。

    【讨论】:

      【解决方案3】:

      正则表达式无法处理。如果您实际上不需要 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;
      }
      

      【讨论】:

      • 请参阅我的答案以了解有关正确 JSON 扫描器的详细信息。这个在很多情况下都会失败。示例:null, 5, true, "test", [], { "}":"foo"}。
      • @back2dos 完全同意。
      【解决方案4】:

      Regex 不是解决此问题的正确工具 - 使用 JSON Parser

      【讨论】:

      • +1,但 JSON 解析器也不是正确的方法,因为输入不是有效的 JSON。可以修改 corelib 解析器以某种方式获取值。
      • 我不需要知道如何解析。我想知道如何拆分它。我认为它只能是简单的正则表达式,但正则表达式不是我的强项。
      • @kasp3r:正则表达式根本无法表达 JSON 语法,除非你想要无限大的正则表达式。
      猜你喜欢
      • 1970-01-01
      • 2020-12-31
      • 2019-04-11
      • 1970-01-01
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-28
      • 2019-05-14
      相关资源
      最近更新 更多