JSON은 JavaScript Object Notation의 약어로서, 최근 들어와서 많이 통용되고 있는 데이터 형식입니다. 이 형식에 관해서 이미 익숙하신 분들도 있겠지만, 혹시나 좀 더 자세한 내용이 궁금하신 분들은 아래 링크의 내용을 참조하시면 좋을 것 같습니다.
http://www.json.org/json-ko.html
오늘은 이와 같은 JSON 형식의 데이터를 IDL에서 읽거나 쓰는 방법에 관한 개략적인 내용을 살펴보고자 합니다. 사실 이러한 기능은 이미 IDL 8.2 버전에서부터 지원이 되어 오고 있습니다. JSON_PARSE 및 JSON_SERIALIZE 두 함수가 이러한 기능을 수행하는데, 전자는 JSON 형식의 데이터를 읽는 역할에 해당되고 후자는 쓰는 역할에 해당됩니다. 자세한 사용법은 IDL 도움말에서 이 함수들에 관한 내용을 보면 잘 나와 있긴 합니다만, 오늘 여기서는 간단한 예제들 위주로 소개를 해보기로 하겠습니다.
먼저 JSON_PARSE 함수부터 살펴보면, 이 함수의 역할은 JSON 형식의 문자열 또는 파일을 읽어서 IDL에서 사용 가능한 데이터로 바꿔주는 것입니다. 그런데 방금 언급한 "IDL에서 사용 가능한 데이터"라는 것이 실제로는 배열이 될 수도 있지만 LIST, HASH, Structure 등과 같은 형태가 되기도 합니다. 사실 이 함수의 디폴트 설정상으로는 LIST 또는 HASH의 형태를 기본으로 하되, 키워드 옵션에 의하여 배열 또는 구조체(Structure)의 형태가 되기도 합니다.
그리고 JSON 데이터의 실제 모습을 보면 두 종류가 있는데요. 꺾쇠괄호인 [ ]로 시작되는 경우가 있고 집합괄호인 { }로 시작되는 경우가 있습니다. 꺾쇠괄호로 표기된 경우는 값들의 나열이라고 보면 되고, 집합괄호로 표기된 경우는 일종의 사전(Dictionary)에 해당되는 형태의 값들이라고 보면 됩니다. 좀 복잡하게 느껴질 수는 있겠지만, 일단 꺾쇠괄호로 둘러싸인 형태의 JSON 데이터를 읽는 예제를 먼저 살펴봅시다.
IDL> json = '[true, null, 42, 3.14, "Hello"]'
IDL> result = JSON_PARSE(json)
IDL> HELP, result
RESULT LIST <ID=1349 NELEMENTS=5>
IDL> PRINT, result
true
!NULL
42
3.1400000000000001
Hello
위 예제에서는 json이라는 이름으로 지정된 JSON 형식의 데이터를 JSON_PARSE 함수로 읽었을 때 IDL이 어떤 식으로 인식을 하는가를 확인할 수 있습니다. 물론 여기서는 JSON_PARSE 함수의 기본 설정만을 사용하였고, 별도의 키워드들을 사용하지는 않았습니다. 이렇게 얻어진 result는 바로 LIST라는 형식의 데이터로 IDL에서 인식이 됩니다. LIST는 배열과 유사하지만 좀 더 유연한 기능들이 제공되는 데이터 형식으로서 IDL 8.0 버전부터 지원되기 시작하였는데, 이에 관한 자세한 내용은 여기(링크1, 링크2)를 참조하시기 바랍니다. 어쨌든 LIST 형식으로 된 result의 내용을 출력한 결과까지 위와 같이 확인할 수 있습니다. 위의 내용을 보면, result가 5개의 항목들로 구성된 LIST 형식의 데이터임을 알 수 있는데, 5개의 항목을 개별적으로 접근하려면, 다음과 같이 배열과 유사한 방식으로 인덱싱을 하면 됩니다.
IDL> HELP, result[0]
<expression> BOOLEAN = true (1)
IDL> HELP, result[1]
<expression> UNDEFINED = !NULL
IDL> HELP, result[2]
<expression> LONG64 = 42
IDL> HELP, result[3]
<expression> DOUBLE = 3.1400000
IDL> HELP, result[4]
<expression> STRING = 'Hello'
집합괄호로 시작하는 JSON 형식의 데이터를 읽을 경우에는 그 결과가 약간 다른 방식으로 얻어지는데요. 다음 예제를 봅시다.
IDL> json = '{"Jupiter":{"Europa":4.8e22, "Ganymede":1.48e23}}'
IDL> result = JSON_PARSE(json)
IDL> HELP, result
IDL> result
IDL> PRINT, result['Jupiter'].Keys()
IDL> PRINT, result['Jupiter', 'Europa']
RESULT ORDEREDHASH <ID=4 NELEMENTS=1>
{
"Jupiter": {
"Europa": 4.8000000000000000e+22,
"Ganymede": 1.4799999999999999e+23
}
}
Europa
Ganymede
4.8000000e+22
위 예제에서 얻은 result에 대하여 HELP 명령으로 확인해보면, OrderedHash라는 형태의 데이터임을 알 수 있습니다. 이것은 기존의 Hash와 유사한 데이터 형식이며, Hash는 일종의 사전(Dictionary)에 해당되는 형식의 데이터로서 key와 value가 함께 쌍을 이루어 존재하는 방식입니다. OrderedHash와 그냥 Hash 사이에도 차이점은 있지만, 이 내용까지 여기서 언급하지는 않겠습니다. 다만, Hash라는 데이터 형식에 관해서는 여기를 참조하시기 바랍니다.
위의 예제들에서는 JSON 형식의 문자열을 JSON_PARSE 함수로 읽는 경우들을 소개하고 있는데요. JSON 형식으로 데이터들이 수록된 파일을 읽어야 할 경우도 있습니다. 이런 파일들은 이름이 .json이라는 확장자를 갖는데요. 다음과 같은 예제 json 파일을 직접 읽어 봅시다. 참고로 이 파일은 미국의 SWPC(Space Weather Prediction Center)에서 배포하는 데이터로서, DSCOVR라는태양풍 관측 위성이 측정한 태양풍의 밀도, 속도, 온도 값들을 담고 있습니다. 1분 간격의 데이터들이 2시간 분량으로 담겨 있는 파일입니다.
이와 같은 JSON 파일의 경우 다음과 같이 그냥 파일 이름을 JSON_PARSE 함수의 인자로 줘버리면 됩니다. 간단하죠.
IDL> result = JSON_PARSE('plasma-2-hour.json')
IDL> HELP, result
RESULT LIST <ID=131 NELEMENTS=118>
이렇게 얻어진 result를 자세히 살펴보면, LIST 형식으로 되어 있고 총 118개의 원소들로 구성되어 있음을 확인할 수 있습니다. 개별원소들을 출력해보면 다음과 같습니다.
IDL> PRINT, result[0]
time_tag
density
speed
temperature
IDL> PRINT, result[1]
2016-09-18 09:38:00.000
9.78
360.8
274779
IDL> PRINT, result[2]
2016-09-18 09:39:00.000
9.88
361.7
268976
결국, 첫번째 원소는 일종의 헤더와 같은 부분으로서 실제 데이터 값들은 아니고, 두번째 원소부터가 실제 데이터 값들에 해당됩니다.마치 일반 텍스트 파일을 읽을 때 첫번째 줄, 두번째 줄, 세번째 줄을 읽는 것과 비슷합니다. 그리고 실제 데이터 값들에 해당되는 원소 하나하나는 다음과 같이 또 별도의 리스트로 인식되고 있습니다.
IDL> HELP, result[2]
<expression> LIST <ID=154 NELEMENTS=4>
따라서 개별 원소에 해당되는 리스트 형식의 데이터를 다음과 같은 방식으로 배열로 변환한 다음 필요에 맞게 사용하면 됩니다.
IDL> data = result[2].ToArray()
IDL> HELP, data
DATA STRING = Array[4]
IDL> PRINT, data
2016-09-18 09:39:00.000 9.88 361.7 268976
여기서는 4개의 문자값들로 구성된 문자 배열로서 인식되었는데, 개별 원소값들 필요에 따라 FIX 또는 FLOAT와 같은 함수들을 사용하여 정수 또는 실수로 변환하여 후속 작업에서 사용하는 것도 가능할 것입니다.
오늘은 JSON_PARSE 함수를 사용하여 JSON 형식의 데이터를 IDL에서 읽어오는 방법들 위주로 소개해 보았습니다. JSON 형식의 데이터를 쓰는 역할을 하는 JSON_SERIALIZE 함수에 관해서는 따로 더 언급하지는 않겠습니다. 사실 관련 도움말을 보면 내용은 간단합니다. 쓰고자 하는 데이터들을 LIST, HASH, Structure와 같은 형태로 구성한 후 이를 바로 JSON_SERIALIZE 함수의 인자로 투입하면 됩니다. 어쨌든 JSON 형식이라고 하는 것이 최근 들어서 C, Java, Perl, Python 등 다양한 언어에서 많이 사용되고 있으며, 이런 형식의 데이터는 JavaScript 기반의 웹페이지에서도 읽기가 쉬운 것으로 알려져 있습니다. 따라서 IDL에서 이러한 형식의 데이터를 읽고 쓰는 방법을 알아두는 것이, 향후 JSON의 형태로 통용되는 다양한 데이터들을 취급하는데 있어서 필수적이지 않을까 생각해 봅니다.
'IDL > Data Type & Format' 카테고리의 다른 글
IDL에서 바이너리(Binary) 파일 읽기 [1] (0) | 2017.12.26 |
---|---|
실수를 정수로 변환하는 방법 (FIX, ROUND, CEIL, FLOOR) (0) | 2017.10.26 |
문자형 값에 대하여 숫자냐 문자냐 여부를 구분하려면? (0) | 2015.02.23 |
새로운 Data Type인 해쉬(Hash)에 관하여 (0) | 2011.05.16 |
새로운 Data Type인 리스트(List)에 관하여 [2] (0) | 2011.05.09 |