PHP json_decode вопрос - PullRequest
       12

PHP json_decode вопрос

6 голосов
/ 11 ноября 2009

Я пытаюсь использовать json_decode, чтобы объединить несколько объектов json, а затем перекодировать его. мой JSON выглядит так:

{
    "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, сохраняю каждый массив «сегментов» в строку, а затем кодирую 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, без инкапсуляции в массиве?

Ответы [ 2 ]

14 голосов
/ 11 ноября 2009

Я думаю, что одним из подходов было бы использование второго параметра для json_decode , assoc:

"Когда TRUE, возвращенные объекты будут преобразованы в ассоциативные массивы. "

Я считаю, что обычно легче иметь дело с ассоциативными массивами, чем с stdClass классом.

<code>$str = '{
   "core": {
        "segment": [
            {
                "id": 7,
                "name": "test1" 
            },
            {
                "id": 4,
                "name": "test2" 
            } 
        ] 
    }
}';
print "<pre>";
print_r(json_decode($str));
print "
"; печать "
";
print_r(json_decode($str,true));
print "
";

Сначала создается версия объекта, затем ассоциативный массив:

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));
2 голосов
/ 11 ноября 2009

Ваш внешний объект содержит два элемента с именем «сегмент». Хотя это допустимый JSON, невозможно иметь объект PHP с двумя разными элементами с одинаковым именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...