При создании объекта в php, используемом для возврата JSON, можно добавить свойство и заставить его идти вверху? Мне бы это понравилось, поскольку объект был открыт через API, и хорошо иметь идентификаторы вверху.
Например:
$obj = new stdClass(); $obj->name = 'John'; $obj->age = 26; $obj->id = 3645;
Когда вы json_encode()
это, он превращается в:
{ "name": "John", "age": 26, "id": 3645 }
Есть ли способ заставить id
в верхней части объекта, даже если он добавлен последним? Обратите внимание: я не могу просто добавить id
перед добавлением name
и age
из-за другого зависимого кода.
Это легко, если вы используете ассоциативный массив вместо объекта, т. Е.
$x = ['name' => 'john', 'age' => 26]; // or: $x = (array)$obj $x = ['id' => 123] + $x; echo json_encode($x); // {"id":123,"name":"john","age":26}
Однако важно отметить, что в JSON упорядочение свойств не определено и на него нельзя положиться . Если у вас в настоящее время есть работы, это изменение было бы бесполезно на самом деле.
Не очень элегантный, но …
$obj = new stdClass(); $obj->name = 'John'; $obj->age = 26; $obj->id = 3645; $name = $obj->name; $age = $obj->age; unset($obj->name); unset($obj->age); $obj->name = $name; $obj->age = $age; echo json_encode($obj);
с$obj = new stdClass(); $obj->name = 'John'; $obj->age = 26; $obj->id = 3645; $name = $obj->name; $age = $obj->age; unset($obj->name); unset($obj->age); $obj->name = $name; $obj->age = $age; echo json_encode($obj);
с$obj = new stdClass(); $obj->name = 'John'; $obj->age = 26; $obj->id = 3645; $name = $obj->name; $age = $obj->age; unset($obj->name); unset($obj->age); $obj->name = $name; $obj->age = $age; echo json_encode($obj);
Хм, хороший вопрос!
Невозможно добавить свойство и заставить его идти вверху. Вы должны отсортировать свойства объекта или ключи массива.
Вот некоторые из них: JSON по определению не упорядочен, но браузеры соблюдают порядок вставки . Подробнее: https://code.google.com/p/v8/issues/detail?id=164
JSON 4.3.3 Object Объект является членом типа Object. Это неупорядоченный набор свойств, каждый из которых содержит примитивное значение, объект или функцию. Функция, хранящаяся в свойстве объекта, называется методом.
Проверьте это: http://ideone.com/Hb4rGQ
<?php function array_reorder_keys($array, $keynames){ if(empty($array) || !is_array($array) || empty($keynames)) return; if(!is_array($keynames)) $keynames = explode(',',$keynames); if(!empty($keynames)) $keynames = array_reverse($keynames); foreach($keynames as $n){ if(array_key_exists($n, $array)){ $newarray = array($n=>$array[$n]); //copy the node before unsetting unset($array[$n]); //remove the node $array = $newarray + array_filter($array); //combine copy with filtered array } } return $array; } $obj = new stdClass(); $obj->name = 'John'; $obj->age = 26; $obj->id = 3645; function get_json_sorted($object, $array) { return json_encode(array_reorder_keys(get_object_vars($object), $array)); } var_dump(get_json_sorted($obj, array('id', 'name', 'age')));
с<?php function array_reorder_keys($array, $keynames){ if(empty($array) || !is_array($array) || empty($keynames)) return; if(!is_array($keynames)) $keynames = explode(',',$keynames); if(!empty($keynames)) $keynames = array_reverse($keynames); foreach($keynames as $n){ if(array_key_exists($n, $array)){ $newarray = array($n=>$array[$n]); //copy the node before unsetting unset($array[$n]); //remove the node $array = $newarray + array_filter($array); //combine copy with filtered array } } return $array; } $obj = new stdClass(); $obj->name = 'John'; $obj->age = 26; $obj->id = 3645; function get_json_sorted($object, $array) { return json_encode(array_reorder_keys(get_object_vars($object), $array)); } var_dump(get_json_sorted($obj, array('id', 'name', 'age')));
Это решение. Поверните объект в массив-ассоциированный элемент. Получите последний элемент (как ключ, так и значение) от массива (я предполагаю, что id
– последний элемент) и переместите его на передний план. Наконец, преобразуйте массив-помощник обратно в объект.
$data_array = json_decode(json_encode($obj), true); if(is_array($data_array)) { end($data_array); $data_array = array_merge(array(key($data_array) => array_pop($data_array)), $data_array); $data = json_decode(json_encode($data_array), false); }