2015-08-19 3 views
0

У меня есть строка json, которую я должен редактировать, а затем преобразовать обратно в json. Но, к сожалению, я не могу восстановить структуру json.json structure difference after edits

Структура исходной строка JSON ($ JSON):

"[{"Language":{"0":"EN"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}, 
{"Language":{"0":"DE"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}, 
{"Language":{"0":"FR"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}]" 

Структура я получаю после моих изменений ($ newJson):

"{"0":{"Language":{"0":"EN"},"Text":{"0":"yyy"},"ContentType":{"0":"PlainText"}}, 
"1":{"Language":{"0":"DE"},"Text":{"0":"yyy"},"ContentType":{"0":"PlainText"}}, 
"2":{"Language":{"0":"FR"},"Text":{"0":"yyy"},"ContentType":{"0":"PlainText"}}}" 

Вот что я делаю со своими правками :

$jsonArray = object_to_array(json_decode($json)); 
$editedJsonArray = someLoopStuff($jsonArray); 
$newJson = json_encode(array_to_object(($editedJsonArray))); 

function object_to_array($obj) { 
    if(is_object($obj)) $obj = (array) $obj; 
    if(is_array($obj)) { 
     $new = array(); 
     foreach($obj as $key => $val) { 
      $new[$key] = $this->object_to_array($val); 
     } 
    } 
    else $new = $obj; 
    return $new; 
} 

function array_to_object($a) { 
    if (is_array($a)) { 
     foreach($a as $k => $v) { 
      $a[$k] = $this->array_to_object($v); 
     } 
     return (object) $a; 
    } 
    return $a; 
} 

У вас есть идея, как я могу получить ту же структуру, что и оригинальный json?

ответ

4

Использование массивов вместо объектов. Перейдите true в json_decode() как второй аргумент, а затем сделайте свой материал на массивах.

$jsonArray = json_decode($json, true); 

Тогда просто сделать операцию в петле на $jsonArray и просто использовать json_encode() без каких-либо дополнительных работ.


Для достижения точно такой же вывод, как у вас на входе вы должны бросить подмассива на объектах:

$jsonArray = json_decode('[{"Language":{"0":"EN"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"DE"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"FR"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}]', true); 

foreach ($jsonArray as &$item) { 
    foreach ($item as &$val) { 
     $val = (object) $val; 
    } 
    unset($val); 
} 
unset($item); 

var_dump(json_encode($jsonArray)); 

Выход:

string(226) "[{"Language":{"0":"EN"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"DE"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}},{"Language":{"0":"FR"},"Text":{"0":"xxx"},"ContentType":{"0":"PlainText"}}]" 
+0

Спасибо, что указал мне в правильном направлении. Но теперь я получаю '{" Язык ": [" EN "]," Текст ": [" xxx "]," ContentType ": [" PlainText "]}' вместо '{" Language ": {" 0 ": "EN"}, "Текст": { "0": "ххх"}, "ТипСодержимого": { "0": "PlainText"}} '. Есть идеи, как это исправить? – Sebsemillia

+0

@Sebsemillia Я только что обновил свой ответ. – marian0

+0

Большое спасибо! – Sebsemillia

0

Что, если бы вы пытаетесь избежать с помощью функции object_to_array и array_to_object. В части кодирования это необязательно, поскольку json_encode может обрабатывать объекты или массивы. В первой части json_decode можно вызвать со вторым необязательным параметром, установленным в true, чтобы создать массив вместо объекта. См. PHP manual.