如何在PHP中以适当的json格式转换包含多个json数据的字符串?

时间:2014-06-05 06:58:22

标签: php json

如何转换此字符串:

{"id":"tag:search.twitter.com,2005:1"}{"id":"tag:search.twitter.com,2005:2"}
{"id":"tag:search.twitter.com,2005:3"}{"id":"tag:search.twitter.com,2005:4"}

进入这种JSON格式:

[
    {"id":"tag:search.twitter.com,2005:1"},
    {"id":"tag:search.twitter.com,2005:2"},
    {"id":"tag:search.twitter.com,2005:3"},
    {"id":"tag:search.twitter.com,2005:4"}
]

3 个答案:

答案 0 :(得分:1)

你可以这样做:

$str = '{"id":"tag:search.twitter.com,2005:1"}{"id":"tag:search.twitter.com,2005:2"}
{"id":"tag:search.twitter.com,2005:3"}{"id":"tag:search.twitter.com,2005:4"}';

// wrap the string in [] to make it an array (when decoded).
// replace all the '}<spaces/line breaks/tabs>{' to '},{' to make it valid JSON array.
// decode the new JSON string to an object.    
$obj = json_decode('[' . preg_replace('/}\s*{/', '},{', $str) . ']');

var_dump($obj);

输出:

array (size=4)
  0 => 
    object(stdClass)[424]
      public 'id' => string 'tag:search.twitter.com,2005:1' (length=29)
  1 => 
    object(stdClass)[517]
      public 'id' => string 'tag:search.twitter.com,2005:2' (length=29)
  2 => 
    object(stdClass)[518]
      public 'id' => string 'tag:search.twitter.com,2005:3' (length=29)
  3 => 
    object(stdClass)[519]
      public 'id' => string 'tag:search.twitter.com,2005:4' (length=29)

答案 1 :(得分:0)

假设您的字符串由放在一起而没有任何分隔符的有效JSON对象组成,您可以执行以下操作:

  1. 使用}{作为分隔符
  2. 拆分字符串
  3. 循环生成的数组中的每个项目并添加缺少的部分
  4. 将数组合并为一个字符串,其中,为分隔符
  5. 在字符串
  6. 之前和之后添加JSON数组标记

    示例($input作为输入字符串):

    $chunks = explode('}{', $input);
    $n = count($chunks);
    for($i = 0; $i < $n; $i++) {
        if($i == 0) {
            $chunks[$i] = $chunks[$i].'}';
        } else if($i == $n - 1) {
            $chunks[$i] = '{'.$chunks[$i];
        } else {
            $chunks[$i] = '{'.$chunks[$i].'}';
        }
    }
    $output = '['.implode(',', $chunks).']';
    

    请注意,它将适用于复杂的结构,但如果文本中有}{,则会失败。但这不太可能。

    编辑:检查当前块是否是错误剪切的一种简单方法是通过检查是"的下一个块开始,因为始终引用JSON对象的属性。如果没有,那么你可以合并当前和下一个块并重复,直到找到正确的字符。

答案 2 :(得分:0)

感谢您对我的问题发表评论......我已通过下面的代码解决了我的问题

    foreach (preg_split("/((\r?\n)|(\r\n?))/", $tdata) as $line)
    {
    print_r(json_decode($line));      
    }