2009-11-11 57 views
6

我想使用json_decode来结合几个json对象,然后重新编码它。我的JSON的样子:PHP json_decode问题

{ 
    "core": { 
     "segment": [ 
      { 
       "id": 7, 
       "name": "test1" 
      }, 
      { 
       "id": 4, 
       "name": "test2" 
      } 
     ] 
    } 
} 

我有几个这样的JSON对象和想结合只有“segement”阵列每个得到的东西是这样的:在

{ 
    "segment": [ 
     { 
      "id": 7, 
      "name": "test1" 
     }, 
     { 
      "id": 4, 
      "name": "test2" 
     } 
    ], 
    "segment": [ 
     { 
      "id": 5, 
      "name": "test3" 
     }, 
     { 
      "id": 8, 
      "name": "test4" 
     } 
    ] 
} 

现在我的php代码,我正在解码json,将每个“segment”数组存储到一个字符串中,然后编码json。

public function handleJSON($json){ 
     $decodeData = json_decode($json); 
     $segment =$decodeData->core; 
     return $segment; 
} 

public function formatJSON(){ 
     $segments = ""; 
    for ($i = 0; $i < count($json);$i++) 
     { 
      $segments .= handleJSON($json[$i]); 
     } 
    echo json_encode($segments); 
} 

当我做到这一点,我收到错误:类stdClass的的 对象不能转换为字符串

所以然后我试图使用它们存储在一个阵列:

public function formatJSON(){ 
     $segments = array(); 
    for ($i = 0; $i < count($json);$i++) 
     { 
      $segments[$i] = handleJSON($json[$i]); 
     } 
    echo json_encode($segments); 
} 

这一次,我没有得到一个错误,但是它将整个组合的json对象存储在数组中。我怎么能只是返回JSON对象,而不被封装在数组中?

回答

14

我认为一个方法将是采取的第二个参数的优点是json_decodeassoc

“为TRUE时,返回的对象将被 转换成关联数组”

我发现通常它更容易处理关联数组而不是stdClass类。

$str = '{ 
    "core": { 
     "segment": [ 
      { 
       "id": 7, 
       "name": "test1" 
      }, 
      { 
       "id": 4, 
       "name": "test2" 
      } 
     ] 
    } 
}'; 
print "<pre>"; 
print_r(json_decode($str)); 
print "</pre>"; 
print "<pre>"; 
print_r(json_decode($str,true)); 
print "</pre>"; 

这首先产生的对象版本,则关联数组:

stdClass Object 
(
    [core] => stdClass Object 
     (
      [segment] => Array 
       (
        [0] => stdClass Object 
         (
          [id] => 7 
          [name] => test1 
         ) 

        [1] => stdClass Object 
         (
          [id] => 4 
          [name] => test2 
         ) 

       ) 

     ) 

) 
Array 
(
    [core] => Array 
     (
      [segment] => Array 
       (
        [0] => Array 
         (
          [id] => 7 
          [name] => test1 
         ) 

        [1] => Array 
         (
          [id] => 4 
          [name] => test2 
         ) 

       ) 

     ) 

) 

我想我会做这样的事情,创造新的空数组,解码为关联数组,抢出了部分成员和将它们拼接成新的空白数组。所以:

$segments = array(); 
// assuming you had a bunch of items in the $strings array 
foreach ($strings as $str) { 
    $item = json_decode($str,true); 
    $segments = array_merge($item['core']['segment], $segments); 
} 

现在,你可以编码这JSON是这样的:

$final_json = json_encode(array('segments'=>$segments)); 
+1

谢谢!这太可笑了! – dtrainer45 2009-11-11 17:45:24

+0

很高兴这有帮助! – artlung 2009-11-11 17:48:56

2

您的外部对象包含两个名为“segment”的项目。虽然这是合法的JSON,但是不可能拥有一个具有相同名称的两个不同项目的PHP对象。