jsonobject
jsonobject
는 JSON 정의에서 오는 객체의 사용을 쉽게 해주는 PHP 클래스입니다. 아이디어는 Python에서 pydantic
사용하고 json 데이터를 객체로 구문 분석하고 유효성을 검사하는 기능에서 비롯됩니다.
jsonobject
사용하나요?나는 PHP의 API를 사용해야 했고, 그 API는 나에게 jsonobject 를 반환했습니다. 그래서 앱에서 사용할 수 있는 PHP 개체로 구문 분석해야 했습니다.
워크플로는 다음과 같습니다.
jsonobject
사용하여 JSON 정의를 구문 분석합니다.다음 JSON 예제를 살펴보겠습니다.
{
"id" : 0 ,
"name" : " John Doe " ,
"age" : 42 ,
"emails" : [
" [email protected] " ,
" [email protected] "
],
"address" : {
"street" : " My street " ,
"number" : 42 ,
"city" : " My city " ,
"country" : " My country "
}
}
jsonobject
사용하면 다음 클래스를 사용하여 데이터 모델을 정의할 수 있습니다.
class User extends jsonobject {
const ATTRIBUTES = [
' id ' => ' int ' ,
' name ' => ' str ' ,
' age ' => ' int ' ,
' emails ' => ' list[str] ' ,
' address? ' => ' Address ' ,
];
}
class Address extends jsonobject {
const ATTRIBUTES = [
' street ' => ' str ' ,
' number ' => ' int ' ,
' city ' => ' str ' ,
' country ' => ' str ' ,
];
}
그리고 다음 명령을 추가합니다.
$ user = User:: fromObject ( json_decode ( $ json_text_definition ));
jsonobject
클래스는 콘텐츠를 객체로 구문 분석하는 작업을 수행하며 정의된 대로 해당 속성을 사용할 수 있습니다.
echo ( $ user -> name );
정의된 클래스에는 애플리케이션의 데이터 모델을 더 쉽게 구현할 수 있는 메서드도 있을 수 있습니다. 예를 들어 User
클래스를 다음과 같이 정의하는 것이 가능합니다:
class User extends jsonobject {
const ATTRIBUTES = [
' id ' => ' int ' ,
' name ' => ' str ' ,
' age ' => ' int ' ,
' emails ' => ' list[str] ' ,
' address? ' => ' Address ' ,
];
public function isAdult () {
return $ this -> age >= 18 ;
}
}
jsonobject
사용 jsonobject
클래스의 아이디어는 이를 사용하여 json 데이터를 객체로 구문 분석하는 것입니다. 따라서 이러한 객체에는 애플리케이션의 데이터 모델을 구현하는 데 도움이 되는 다른 메서드가 포함될 수 있습니다.
json 객체(또는 배열)가 구문 분석될 때 해당 콘텐츠는 ATTRIBUTES
상수에 정의된 유형에 따라 재귀적으로 구문 분석됩니다. 데이터에 예상된 값이 포함되어 있지 않아 데이터가 유효하지 않은 경우 예외가 발생합니다.
jsonobject 사용하려면 jsonobject
하위 클래스로 분류하고 해당 클래스의 ATTRIBUTES
상수를 정의하여 각 클래스의 유형과 함께 해당 클래스의 객체에 대해 예상되는 속성을 정의해야 합니다.
ATTRIBUTES
상수는 키가 각 속성의 이름 이고 값이 각 속성의 유형 인 연관 배열입니다.
가능한 유형은 다음과 같습니다.
jsonobject
의 하위 클래스여야 하는 클래스 이름입니다. 속성 이름을 정의할 때 ?
이름 끝에 속성이 선택 사항임을 나타냅니다. 예를 들어 속성 이름 address?
사용 사례 섹션에서는 선택 사항입니다.
각 필드는 필수 항목으로 간주되므로 구문 분석된 개체(또는 배열)에 있어야 합니다. 또한 객체는 정의된 유형이어야 합니다(즉, 특정 유형으로 올바르게 구문 분석되어야 함).
선택 사항이 아닌 모든 속성은 미친 것으로 간주됩니다. 이는 다음 두 가지 점에서 특히 중요합니다.
fromArray
또는 fromObject
함수 사용)jsonobject
의 객체 또는 배열 표현을 생성할 때 외부 구조에서 객체를 생성할 때 jsonobject
모든 필수 필드를 처리합니다. 그리고 그 중 하나라도 누락되면 예외가 발생합니다.
다음 예에서는 필수 필드 연령이 제공되지 않아 예외가 발생합니다.
class User extends jsonobject {
const ATTRIBUTES = [
" name " => " str " ,
" age " => " int " ,
];
}
( . . . )
$ user = User:: fromArray ([ " name " => " John " ]);
객체를 배열이나 객체로 변환할 때(또는 해당 JSON 표현을 가져올 때) 필수 필드는 설정되지 않은 경우에도 기본값을 가져옵니다.
그럼 다음 예시에서는
class User extends jsonobject {
const ATTRIBUTES = [
" name " => " str " ,
" age " => " int " ,
" birthDate? " => " str "
];
}
$ user = new User ();
echo (( string ) $ user );
출력은 다음과 같습니다
{
"name" : " " ,
"age" : 0
}
이름 과 나이 속성은 필수이고 기본값(예: 숫자의 경우 0, 문자열, 목록 또는 사전의 경우 비어 있음)을 가져오지만, birthdayDate 속성은 필수가 아니며 아직 설정되지 않았습니다. 따라서 출력에서는 생성되지 않습니다.
null
로 설정값을 null 로 설정하는 문제는 속성이 선택 사항인지 여부를 고려할 때 특히 관련이 있습니다.
값을 null 로 설정하면 값이 설정 해제 된다는 뜻이므로 선택적 값에만 가능하고 필수 값에는 가능하지 않다고 생각할 수도 있습니다.
jsonobject
에는 다른 개념이 있습니다. 속성을 null 로 설정한다는 것은 "값을 null 로 설정"하고 속성을 설정 해제하지 않음을 의미하기 때문입니다. 속성을 설정 해제 하려면 unset 함수를 사용하거나 그와 유사한 방법을 사용해야 합니다.
jsonobject
사용하면 값을 설정 해제 할 수도 있습니다. 선택적 속성의 경우 이는 값을 제거한다는 의미이므로 배열 표현이나 객체에 값이 없습니다(값을 검색하는 경우 null 로 설정됨).
그러나 필수 속성의 경우 설정을 해제하면 해당 값이 기본값으로 재설정 됩니다. 즉, 해당 유형의 기본값(예: 숫자의 경우 0, 목록, 문자열 또는 사전의 경우 비어 있음) 또는 ATTRIBUTES
상수의 기본값으로 초기화된다는 의미입니다.
jsonobject
는 상위 클래스로부터 속성을 상속받을 수도 있습니다. 다음 예를 들어보세요.
class Vehicle extends jsonobject {
const ATTRIBUTES = [
" brand " => " str " ,
" color " => " str "
]
}
class Car extends Vehicle {
const ATTRIBUTES = [
" wheels " => " int "
]
}
class Boat extends Vehicle {
const ATTRIBUTES = [
" length " => " float "
]
}
이 예에서 Vehicle
클래스에는 브랜드 및 색상 속성만 있지만 Car
클래스에는 브랜드 , 색상 및 바퀴 속성이 있고 Boat
클래스에는 브랜드 , 색상 및 길이 속성이 있습니다.
jsonobject
의 하위 클래스의 객체는 json 구문 분석 객체에서 시작하여 정적 메서드 ::fromArray
또는 ::fromObject
사용하여 생성할 수 있습니다.
이전 예에서 다음 콘텐츠가 포함된 car.json 파일이 있는 경우:
{
"brand" : " BMW " ,
"color" : " black "
}
다음 코드를 사용하여 Vehicle
클래스의 인스턴스를 가져올 수 있습니다.
$ json = file_get_contents ( " car.json " );
$ vehicle = Vehicle:: fromArray (( array ) json_decode ( $ json , true ));
대안은 다음 예와 같이 객체를 인스턴스화하는 것입니다.
* PHP 8 이상:
$ car = new Car (brand: " BMW " , color: " black " , wheels: 4 );
* 이전 PHP 버전:
$ car = new Car ([ " brand " => " BMW " , " color " => " black " , " wheels " => 4 ]);
jsonobject
jsonobject
는 이 라이브러리의 핵심 클래스입니다. 그 방법은 다음과 같습니다:
__construct($data)
- 주어진 데이터에서 새 객체를 생성합니다.__get($name)
- 주어진 이름을 가진 속성의 값을 반환합니다.__set($name, $value)
- 주어진 이름을 가진 속성의 값을 설정합니다.__isset($name)
- 주어진 이름의 속성이 설정된 경우 true를 반환합니다.__unset($name)
- 선택적 속성 값을 설정 해제합니다(또는 필수 속성 값을 재설정합니다).toArray()
- 객체의 데이터가 포함된 연관 배열을 반환합니다. 배열은 각 속성의 각 하위 속성을 방문하여 반복적으로 생성됩니다.toObject()
- 객체의 데이터를 속성으로 포함하는 객체를 반환합니다. 배열은 각 속성의 각 하위 속성을 방문하여 반복적으로 생성됩니다.toJson()
- 객체를 표준 객체로 표현한 json 문자열을 반환합니다.::fromArray($data)
- 주어진 연관 배열을 클래스에 정의된 속성으로 구문 분석하여 객체를 생성합니다. 각 속성은 정의된 유형에 따라 재귀적으로 구문 분석됩니다.::fromObject($data)
- 주어진 객체를 클래스에 정의된 속성으로 구문 분석하여 객체를 생성합니다. 각 속성은 정의된 유형에 따라 재귀적으로 구문 분석됩니다. JsonDict
이 객체는 json 정의에서 나오는 사전을 처리하는 데 사용됩니다. JsonDict
클래스는 각 요소가 지정된 형식에 속하도록 형식화되어 있습니다.
JsonDict
객체는 배열과 유사한 객체(예: $jsonDict["key1"])로 사용될 수 있지만 (이 텍스트를 쓰는 순간) 사전에 삽입된 요소의 유형은 확인되지 않습니다. 이 유형은 dict를 생성할 때(예: fromArray
정적 함수 사용) 콘텐츠를 구문 분석하거나 콘텐츠를 배열이나 객체에 덤프(예: toArray
함수 사용)하는 데 사용됩니다.
방법은 다음과 같습니다.
toArray()
toObject()
::fromArray($data)
::fromObject($data)
이러한 메서드는 jsonobject
의 경우와 동일한 방식으로 해석됩니다. 그리고 dict의 요소 유형은 콘텐츠를 구문 분석할 때 재귀적으로 고려되는 복합 유형을 참조할 수 있습니다.
예를 들어 list[list[int]]
유형은 [ [ 1, 2, 3], [ 4, 5, 6 ]]
구문 분석에 사용됩니다.
JsonArray
이 개체는 인덱스가 정수여야 한다는 점을 제외하면 JsonDict
와 거의 동일합니다. 이 경우 $value["key1"]
예외가 발생합니다.
이 경우 배열에 요소를 추가하는 함수(예: []
)도 구현됩니다.
클래스를 정의할 때 새로 생성된 객체의 값과 선택적인 속성을 초기화할 수 있습니다.
두 가지 방법이 있습니다:
### 클래스 속성 사용
클래스 속성을 사용하여 객체의 값을 초기화할 수 있으므로 클래스에 속성 값이 설정되어 있으면 해당 속성이 정의되어 있으면 인스턴스에 속성으로 복사됩니다.
예:
class User extends jsonobject {
const ATTRIBUTES = [
' id ' => ' int ' ,
' name ' => ' str ' ,
' age ' => ' int ' ,
' emails ' => ' list[str] ' ,
' address? ' => ' Address ' ,
' sex? ' => ' str '
];
public $ sex = " not revealed " ;
}
이제 sex
속성은 null 대신 공개되지 않도록 초기화됩니다.
이를 만드는 방법은 객체 유형에 대해 튜플 [ <type>, <default value> ]
정의하는 것입니다. 다음 예를 들면 다음과 같습니다.
class User extends jsonobject {
const ATTRIBUTES = [
' id ' => ' int ' ,
' name ' => ' str ' ,
' age ' => ' int ' ,
' emails ' => ' list[str] ' ,
' address? ' => ' Address ' ,
' sex? ' => [ ' str ' , ' not revealed ' ]
];
}
사용자 데이터를 검색할 때 성별 속성 sex
선택 사항입니다. 클래스에 대해 이 새로운 정의를 사용하면 sex
설정되지 않은 경우 값은 null
대신 "공개되지 않음"으로 설정됩니다.
중요한 특징은 <기본값> 으로 설정된 문자열이 객체의 메서드에 해당하는 경우 값을 가져올 때 해당 문자열이 호출되고(아직 설정되지 않은 경우) 해당 속성에 설정된 값이 호출의 결과가 됩니다.
예:
class User extends jsonobject {
const ATTRIBUTE = [
...
' birthDay? ' => [ ' str ' , ' computeBirthDate ' ]
]
function computeBirthDate () {
$ now = new DateTime ();
$ now ->sub( DateInterval ::createFromDateString("{ $ this -> age } years"));
return $ now ->format("Y-m-d");
}
}
이 예에서 birthDate
속성을 설정하지 않았지만 검색된 경우 현재 날짜에서 나이를 빼서 계산됩니다.
임의의 객체를 jsonobject
로 구문 분석하려면 jsonobject ::parse_typed_value
함수를 사용할 수 있습니다. 이는 모든 유형을 jsonobject
유형으로 변환할 수 있다는 점에서 중요합니다.
예를 들어
$ myobject = jsonobject :: parse_typed_value ( " list[str] " , [ " my " , " name " , " is " , " John " ]);
JsonList<str>
유형의 객체를 얻습니다.
이 라이브러리의 기본 동작은 속성에 설정된 값이 정의된 유형과 일치하는지 확인하는 것입니다. 그러나 이는 float
int
아니기 때문에 float를 0
으로 설정하면 0
이 정수이기 때문에 실패한다는 의미입니다. 이 경우 사용자는 값을 할당하기 전에 값을 캐스팅 해야 합니다 . 유형을 엄격하게 검사할지 여부를 제어하려면 STRICT_TYPE_CHECKING
상수를 사용할 수 있습니다.
STRICT_TYPE_CHECKING
이True
로 설정된 경우 유형이 엄격하게 검사되며 예를 들어int
에9.3
할당하면 예외가 발생합니다.False
로 설정하면 숫자 유형이 서로 변환됩니다. 예를 들어9.3
int
에 할당하면 자동으로9
로 잘립니다.
다른 중요한 유형 검사는 숫자 유형에 빈 값(예: ""
또는 null
)을 할당하는 경우입니다. 이 경우 상수 STRICT_TYPE_CHECKING_EMPTY_ZERO
가 있습니다.
STRICT_TYPE_CHECKING_EMPTY_ZERO
True
(기본 동작)로 설정된 경우 숫자 유형에 빈 값을 할당하면0
으로 간주됩니다. 즉,int
속성에 빈 문자열이나null
값을 할당하는 것은0
할당하는 것을 의미합니다.False
로 설정하면 라이브러리는 유형을 확인하고 결국 예외를 발생시킵니다.
이제 JsonList
음수 인덱스도 사용할 수 있으므로 -1
이 마지막 요소가 되고 -2
두 번째 요소가 됩니다.
JsonList
객체에는 정렬 또는 필터링 기능이 포함되어 있습니다.
public function sort(callable $callback = null) : JsonList
: 주어진 콜백을 사용하여 목록을 정렬합니다. 콜백이 제공되지 않으면 기본 비교 함수를 사용하여 목록을 정렬합니다.public function filter(callable $callback) : JsonList
: 주어진 콜백을 사용하여 목록을 필터링합니다. 콜백은 부울 값을 반환해야 합니다. 콜백이 true
반환하면 요소가 결과 목록에 포함됩니다. false
반환하면 요소가 삭제됩니다.