개체를 JSON으로 변환하고 PHP에서 JSON을 개체로 변환(Java의 경우 Gson과 같은 라이브러리)
저는 PHP에서 웹 어플리케이션을 개발하고 있습니다.
서버에서 많은 오브젝트를 JSON 문자열로 전송해야 하는데, Java의 Gson 라이브러리와 같이 PHP가 오브젝트를 JSON으로 변환하고 JSON String을 Objec으로 변환하는 라이브러리가 있습니까?
이거면 효과가 있을 거야!
// 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
// )
오브젝트가 아닌 어레이로 출력하려면 pass(pass)true
로.json_decode
print_r(json_decode($json, true));
// Array
// (
// [hello] => world
// [bar] => baz
// )
'json_decode()'도 참조
대규모 앱의 확장성을 높이려면 캡슐화된 필드가 있는 oop 스타일을 사용합니다.
간단한 방법:-
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(new Fruit()); //출력:
{"category":"Apple","EatenTime":"2013-01-31T11:17:07-0500"}
PHP의 Real Gson :-
- http://jmsyst.com/libs/serializer
- http://symfony.com/doc/current/components/serializer.html
- http://framework.zend.com/manual/current/en/modules/zend.serializer.html
- http://fractal.thephpleague.com/ - 시리얼화만
json_decode($json, true);
// the second param being true will return associative array. This one is easy.
PHP8-코드:
class foo{
function __construct(
public $bar,
protected $bat,
private $baz,
){}
function getBar(){return $this->bar;}
function getBat(){return $this->bat;}
function getBaz(){return $this->baz;}
}
//Create Object
$foo = new foo(bar:"bar", bat:"bat", baz:"baz");
//Object => JSON
$fooJSON = json_encode(serialize($foo));
print_r($fooJSON);
// "O:3:\"foo\":3:{s:3:\"bar\";s:3:\"bar\";s:6:\"\u0000*\u0000bat\";s:3:\"bat\";s:8:\"\u0000foo\u0000baz\";s:3:\"baz\";}"
// Important. In order to be able to unserialize() an object, the class of that object needs to be defined.
# More information here: https://www.php.net/manual/en/language.oop5.serialization.php
//JSON => Object
$fooObject = unserialize(json_decode($fooJSON));
print_r($fooObject);
//(
# [bar] => bar
# [bat:protected] => bat
# [baz:foo:private] => baz
# )
//To use some functions or Properties of $fooObject
echo $fooObject->bar;
// bar
echo $fooObject->getBat();
// bat
echo $fooObject->getBaz();
// baz
나는 이것을 해결하기 위한 방법을 만들었다.저의 접근법은 다음과 같습니다.
1 - Regex를 사용하여 객체를 어레이(프라이빗 속성 포함)로 변환하는 메서드가 있는 추상 클래스를 만듭니다.2 - 반환된 어레이를 json으로 변환합니다.
이 Abstract 클래스를 모든 도메인 클래스의 상위 클래스로 사용합니다.
클래스 코드:
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;
}
}
언급URL : https://stackoverflow.com/questions/9858448/converting-object-to-json-and-json-to-object-in-php-library-like-gson-for-java
'programing' 카테고리의 다른 글
구성에서 '서비스' 유형의 빈을 정의하는 것을 고려합니다[스프링 부트] (0) | 2023.03.26 |
---|---|
Next.js "빌드 타임"은 정확히 언제 발생합니까? (0) | 2023.03.26 |
AngularJS: 컨트롤러를 완전히 새로고침하지 않고 해시 및 라우팅 변경 (0) | 2023.03.21 |
약속.RxJs Observatible을 사용한 모든 동작? (0) | 2023.03.21 |
긴 숫자에 의한 JSON 언마셜링에 부동소수점 번호가 부여됩니다. (0) | 2023.03.21 |