JSON 파싱 함수 설명
이 문서에서는 JSON 문자열을 파싱하여 중첩된 배열과 구조체로 변환하는 json_parse
함수에 대해 설명합니다. 배열은 JSON 배열에 해당하고, 구조체는 JSON 객체에 해당합니다. JSON은 json_stringify
를 사용하여 미리 생성되었거나 다른 유효한 소스에서 가져와야 합니다. 파싱할 문자열을 제공하면, 함수는 최상위 배열 또는 구조체를 반환하며, 이를 코드에서 사용할 수 있습니다.
사용 주의 사항
- 유효하지 않은 값을 파싱하려고 하면 예외 오류가 발생합니다. (예: 문자열이 아니거나 유효하지 않은 JSON)
- 이 함수는 최대 128의 중첩 깊이를 가진 JSON 파일만 로드할 수 있습니다.
null
값은undefined
로 파싱됩니다.json_stringify
로 직렬화된 런타임 값은 다시 런타임 값으로 변환됩니다. (예: 핸들,int64
,NaN
,infinity
등) 그러나 이 변환은 선택적 인수inhibit_string_convert
에true
를 전달하여 비활성화할 수 있습니다.- 자세한 내용은 데이터 변환 및 JSON 사용 가이드를 참조하세요.
문법
json_parse(json, [filter_func], [inhibit_string_convert])
인수 | 유형 | 설명 |
---|---|---|
json | String | 파싱할 JSON 문자열 |
filter_func | Function | 각 항목을 처리하는 필터 함수. inhibit_string_convert 만 설정할 경우 값이나 undefined 를 전달하지 마세요. |
inhibit_string_convert | Boolean | 문자열을 런타임 참조로 변환하지 않도록 설정합니다. 기본값은 false 입니다. |
반환 값
- 구조체 또는 배열
예제 1: 기본 사용법
var json = "{\"myObj\": { \"apples\":10, \"oranges\":12, \"potatoes\":100000, \"avocados\":0 }, \"myArray\":[0, 1, 2, 2, 4, 0, 1, 5, 1]}";
var data = json_parse(json);
show_debug_message(data);
위 코드는 유효한 JSON을 포함하는 새 문자열을 생성하고, json_parse
를 호출하여 해당 문자열을 GML 구조체로 변환합니다. 결과는 디버그 로그에 출력됩니다.
JSON 문자열 내의 모든 큰따옴표("
) 앞에 백슬래시(\
)가 있는 것을 확인할 수 있습니다. 이는 큰따옴표가 문자열 내에서 실제 문자로 읽히도록 하기 위함입니다. 외부 파일에서 JSON을 로드하는 경우, 그 파일 내에서는 문자를 이스케이프할 필요가 없습니다.
JSON 문자열을 파싱한 후, 구조를 알고 있다면 다양한 변수 함수들을 사용하여 내용을 확인하고 읽을 수 있습니다.
var data = json_parse(json);
// myObj 변수가 있는지 확인
if (struct_exists(data, "myObj")) {
// 구조체인지 확인
if (is_struct(data.myObj)) {
// 구조체의 모든 멤버를 로그에 출력
var _names = struct_get_names(data.myObj);
var _str = "";
for (var i = 0; i < array_length(_names); i++) {
_str = _names[i] + ": " + string(struct_get(data.myObj, _names[i]));
show_debug_message(_str);
}
}
}
// myArray 변수가 있는지 확인
if (struct_exists(data, "myArray")) {
// 배열인지 확인
if (is_array(data.myArray)) {
show_debug_message(data.myArray);
}
}
위 코드는 주어진 JSON 문자열을 파싱하고, 다음과 같은 콘솔 출력을 생성합니다:
oranges: 12
potatoes: 100000
avocados: 0
apples: 10
[ 0,1,2,2,4,0,1,5,1 ]
예제 2: 필터 함수 사용
var json = "{\"myObj\": { \"apples\":10, \"oranges\":12, \"potatoes\":100000, \"avocados\":0 }, \"myArray\":[0, 1, 2, 2, 4, 0, 1, 5, 1]}";
var data = json_parse(json, function (key, value) {
show_debug_message($"Key: {key}, Value: {value}");
return value;
});
위 코드는 이전 예제와 동일한 JSON 문자열을 사용하지만, 이번에는 필터 함수를 사용합니다. 필터 함수는 각 항목의 키와 값을 출력 로그에 표시합니다.
출력 예시는 다음과 같습니다:
Key: apples, Value: 10
Key: oranges, Value: 12
Key: potatoes, Value: 100000
Key: avocados, Value: 0
Key: myObj, Value: { apples : 10, oranges : 12, potatoes : 100000, avocados : 0 }
Key: 8, Value: 1
Key: 7, Value: 5
Key: 6, Value: 1
Key: 5, Value: 0
Key: 4, Value: 4
Key: 3, Value: 2
Key: 2, Value: 2
Key: 1, Value: 1
Key: 0, Value: 0
Key: myArray, Value: [ 0,1,2,2,4,0,1,5,1 ]
Key: , Value: { myObj : { apples : 10, oranges : 12, potatoes : 100000, avocados : 0 }, myArray : [ 0,1,2,2,4,0,1,5,1 ] }
예제 3: 값 재정의
var json = "{\"prices\": [2, 5, 1, 2, 4, 5]}";
var data = json_parse(json, function (key, value) {
return is_real(value) ? value * 1000 : value;
});
show_debug_message(data);
위 코드는 구조체 내에 배열이 포함된 JSON 문자열을 사용합니다. 그런 다음 json_parse
를 필터 함수와 함께 실행하여 각 값을 1000으로 곱합니다. 결과 구조는 다음과 같습니다:
{ prices : [ 2000,5000,1000,2000,4000,5000 ] }