Преобразование объекта в JSON и JSON в объект в PHP (библиотека, подобная Gson для Java)
Я разрабатываю веб-приложение на PHP,
Мне нужно перенести много объектов с сервера в виде строки JSON, существует ли какая-либо библиотека для PHP для преобразования объекта в JSON и строки JSON в объект, например библиотека Gson для Java.
4 answers
Это должно сработать!
// convert object => json
$json = json_encode($myObject);
// convert json => object
$obj = json_decode($json);
Вот пример
$foo = new StdClass();
$foo->hello = "world";
$foo->bar = "baz";
$json = json_encode($foo);
echo $json;
//=> {"hello":"world","bar":"baz"}
print_r(json_decode($json));
// stdClass Object
// (
// [hello] => world
// [bar] => baz
// )
Если вы хотите получить вывод в виде массива, а не объекта, передайте true
в json_decode
print_r(json_decode($json, true));
// Array
// (
// [hello] => world
// [bar] => baz
// )
Подробнее о json_encode()
См. также: json_декод()
Для большей расширяемости для крупномасштабных приложений используйте стиль ооп с инкапсулированными полями.
Простой способ:-
class Fruit implements JsonSerializable {
private $type = 'Apple', $lastEaten = null;
public function __construct() {
$this->lastEaten = new DateTime();
}
public function jsonSerialize() {
return [
'category' => $this->type,
'EatenTime' => $this->lastEaten->format(DateTime::ISO8601)
];
}
}
Echo json_encode(новый фрукт()); //который выводит:
{"category":"Apple","EatenTime":"2013-01-31T11:17:07-0500"}
Реальный Gson на PHP :-
json_decode($json, true);
// the second param being true will return associative array. This one is easy.
Я создал метод для решения этой проблемы. Мой подход таков:
1 - Создайте абстрактный класс, у которого есть метод преобразования объектов в массив (включая частный доступ) с помощью регулярного выражения. 2 - Преобразуйте возвращаемый массив в json.
Я использую этот абстрактный класс в качестве родителя всех моих классов домена
Код класса:
namespace Project\core;
abstract class AbstractEntity {
public function getAvoidedFields() {
return array ();
}
public function toArray() {
$temp = ( array ) $this;
$array = array ();
foreach ( $temp as $k => $v ) {
$k = preg_match ( '/^\x00(?:.*?)\x00(.+)/', $k, $matches ) ? $matches [1] : $k;
if (in_array ( $k, $this->getAvoidedFields () )) {
$array [$k] = "";
} else {
// if it is an object recursive call
if (is_object ( $v ) && $v instanceof AbstractEntity) {
$array [$k] = $v->toArray();
}
// if its an array pass por each item
if (is_array ( $v )) {
foreach ( $v as $key => $value ) {
if (is_object ( $value ) && $value instanceof AbstractEntity) {
$arrayReturn [$key] = $value->toArray();
} else {
$arrayReturn [$key] = $value;
}
}
$array [$k] = $arrayReturn;
}
// if it is not a array and a object return it
if (! is_object ( $v ) && !is_array ( $v )) {
$array [$k] = $v;
}
}
}
return $array;
}
}