맞춤형 App 생성하기 > 공식 및 함수 작업하기 > JSON 함수 작업하기
 

JSON 함수 작업하기

FileMaker Pro Advanced는 사용자의 솔루션이 다른 소스(예: JSON 포맷에서 REST API를 통해 데이터를 전송하는 웹 서비스)에서 JSON 데이터를 분석하고 수정할 수 있게 하는 몇 가지 텍스트 함수를 제공합니다.

JSON 데이터 포맷에 대한 자세한 정보는 json.org를 참조하십시오.

웹 서비스에서 JSON 데이터 검색하기

URL에서 삽입 스크립트 단계를 사용하여 웹 서비스에 접근하고, 검색하려는 정보에 대한 매개 변수를 지정하고, HTTP 헤더를 전송 및 수신하고, 결과를 변수나 필드로 저장합니다.

예를 들어 제과에서 JSON 포맷으로 REST API를 통해 클라이언트가 사용할 수 있는 제품 목록을 만듭니다. 다음은 $$JSON 변수의 JSON 데이터로 오늘의 특별 메뉴 목록을 반환합니다.

변수 설정 [ $url ; "https://<제과_도메인_이름>/rest/api/products" ]URL에서 삽입 [SSL 인증서 확인; 대화상자 사용: 끔; $$JSON ;
$url ; "--data 목록=특별 메뉴" ]

$$JSON에 반환된 데이터는 JSON 데이터 예제를 참조하십시오.

FileMaker Pro Advanced는 일부 REST API에서 요구하는 문자 인코딩 및 암호화된 서명을 처리하는 몇 가지 유틸리티 함수도 제공합니다.

HexDecode 함수

HexEncode 함수

TextDecode 함수

TextEncode 함수

Base64Decode 함수

Base64EncodeRFC 함수

CryptAuthCode 함수

CryptDigest 함수

JSON 데이터 포맷 설정하기

JSON 데이터는 요소 사이에 공백이나 라인 엔딩이 필요하지 않습니다. 하지만 문제를 디버그하는 동안 데이터를 읽기 쉽게 만드려면 JSONFormatElements 함수를 사용합니다. 이는 JSON 데이터 예제에 있는 것처럼 탭과 라인 엔딩 문자를 추가해 줍니다.

JSON 데이터 분석하기

다음 JSON 함수를 사용하여 JSON 데이터(더 작업할 수 있는 키, 값 또는 전체 JSON 대상체 또는 배열)를 분석합니다.

JSONGetElement - 요소의 JSON 데이터에 쿼리 수행(대상체, 배열 또는 값)

JSONListKeys - 대상체 이름(키) 나열 또는 JSON 데이터의 인덱스 배열

JSONListValues - JSON 데이터의 값 나열

이 함수의 첫 번째 매개 변수 json은 유효한 JSON 데이터를 포함하는 텍스트 필드, 변수 또는 텍스트 표현식을 지정하여 수행합니다.

두 번째 매개 변수, 키 또는 인덱스 또는 경로는 JSON 데이터의 부분이 다음을 수행하도록 지정합니다.

키 - JSON 대상체의 키 이름

인덱스 - JSON 배열에 있는 요소의 인덱스(첫 번째 요소의 인덱스는 0임)

경로 - 키 이름, 배열 인덱스 또는 둘 모두의 계층형 문자열

키 또는 인덱스 또는 경로 매개 변수에 대한 다음 구문이 지원됩니다.

 

키 또는 인덱스 또는 경로 매개 변수

의미

"."

첫 번째 문자인 경우 루트 레벨(선택 사항)

".[n]"

루트 레벨에 있는 배열의 인덱스 n에 있는 요소

".name"

루트 레벨에 있는 name이라는 이름의 대상체의 키

".nameA.nameB.nameC"

nameB와 nameA의 하위 항목인 nameC이라는 이름의 대상체

".[3][2][1]nameA[0]"

nameA 대상체(중첩된 배열 세트의 레벨 3에 있음)에 있는 배열의 첫 번째 요소

다음 예제 스크립트는 JSONListKeys를 사용하는 JSON 데이터 예제($$JSON 변수에 저장됨)에서 제품 수를 결정하고 각 제품의 레코드를 생성한 다음, 각 제품의 JSONGetElement를 사용하여 얻은 값으로 각 레코드에 필드를 설정합니다.

변수 설정 [ $ProductCount ; 값:
   ValueCount (
      JSONListKeys ( $$JSON ; "제과.제품" )
   ) ]
변수 설정 [ $i; 값: 0 ]
If [ $ProductCount > 0 ]
   Loop
      새로운 레코드/요청
      필드 설정 [ 제품::ID ;
         JSONGetElement ( $$JSON ; "제과.제품[" & $i & "]id" ) ]
      필드 설정 [ 제품::가격 ;
         JSONGetElement ( $$JSON ; "제과.제품[" & $i & "]가격" ) ]
      필드 설정 [ 제품::재고 ;
         JSONGetElement ( $$JSON ; "제과.제품[" & $i & "]재고" ) ]
      레코드/요청 커밋 [ 대화상자 사용: 끔 ]
      변수 설정 [ $i ; 값: $i + 1 ]
      Exit Loop If [ $i $ProductCount ]
   End Loop
End If

JSON 데이터 요소 변경 및 추가하기

JSON 데이터에 요소를 추가하고 값을 변경하려면 JSONSetElement 함수를 사용합니다. json키 또는 인덱스 또는 경로 매개 변수는 이 함수에서 JSON 데이터 분석하기에 설명된 것처럼 동작합니다. 키 또는 인덱스 또는 경로가 존재하는 요소를 지정하는 경우, 해당 요소의 값이 변경됩니다. 존재하지 않는 요소를 지정하는 경우 값이 추가됩니다.

JSONSetElement는 매개 변수에 지정된 요소를 설정합니다. 간단한 문자열이나 숫자부터 복잡한 대상체나 배열까지 유효한 모든 JSON 값을 지정할 수 있습니다.

유형 매개 변수는 의 데이터 유형을 지정하여 각 데이터 유형을 처리할 때 JSON 파서가 엄격한 규칙을 따르도록 합니다. 지원되는 데이터 유형은 JSONSetElement 함수를 참조하십시오. 데이터를 유효한 JSON 요소로 포맷된 json에 삽입하려면, 유형JSONRaw로 설정합니다.

다음 예제는 비어있는 JSON 대상체에 새로운 제품에 대한 키 값의 쌍을 추가합니다. 그런 다음, 새로운 대상체는 $$JSON 변수에 있는 제품 배열의 맨 끝에 추가됩니다(JSON 데이터 예제 참조).

변수 설정 [ $NewProduct ; 값:
   JSONSetElement ( "{}" ;
      [ "id" ; "FB4" ; JSONString ] ;
      [ "이름" ; "바닐라 케이크" ; JSONString ] ;
      [ "가격" ; 17.5 ; JSONNumber ] ;
      [ "재고" ; 12 ; JSONNumber ] ;
      [ "범주" ; "케이크" ; JSONString ] ;
      [ "특별 메뉴" ; true ; JSONBoolean ]
   ) ]
변수 설정 [ $NextIndex ; 값:
   ValueCount (
      JSONListKeys ( $$JSON ; "제과.제품" )
   ) ]
변수 설정 [ $$JSON ; 값:
   JSONSetElement (
      $$JSON ; "제과.제품[" & $NextIndex & "]" ; $NewProduct ;
      JSONObject
   ) ]

JSON 데이터 요소 삭제하기

요소를 삭제하려면 JSONDeleteElement 함수를 사용합니다. json키 또는 인덱스 또는 경로 매개 변수는 이 함수에서 JSON 데이터 분석하기에 설명된 것처럼 동작합니다. 키 또는 인덱스 또는 경로 매개 변수는 반드시 json에 있는 요소를 지정해야 합니다.

다음 예제는 $$JSON 변수의 "id" 키에 "FB3" 값이 있는 제품 배열의 요소를 삭제합니다(JSON 데이터 예제 참조).

변수 설정 [ $ProductCount ; 값:
   ValueCount (
      JSONListKeys ( $$JSON ; "제과.제품" )
   ) ]
변수 설정 [ $i ; 값: 0 ]
If [ $ProductCount > 0 ]
   Loop
      변수 설정 [ $ID ; 값:
         JSONGetElement ( $$JSON ; "제과.제품[" & $i & "]id" ) ]
      If [ $ID = "FB3" ]
         변수 설정 [ $$JSON ; 값:
            JSONDeleteElement ( $$JSON ; "제과.제품[" & $i & "]" ) ]
         스크립트 종료 [ 텍스트 결과: 0 ]
      End If
      변수 설정 [ $i ; 값: $i + 1 ]
      Exit Loop If [ $i $ProductCount ]
   End Loop
End If

JSON 데이터에 있는 오류 처리하기

json 매개 변수를 분석하는 동안 오류가 발생한 경우, JSON 함수는 "?"과 함께 JSON 파서의 오류 메시지를 반환합니다.

예를 들어 "제과" 키 다음에 ":"가 JSON 데이터 예제에서 빠진 경우 이 계산은

JSONGetElement ( $$JSON ; "제과.제품[0]id" )

다음 오류 메시지를 반환합니다.

? * Line 3, Column 2
  Missing ':' after object member name
* Line 13, Column 5
  Extra non-whitespace after JSON value.

JSON 데이터를 사용하기 전에 데이터가 유효한지 확인하려면 JSONFormatElements 함수를 사용하고 첫 번째 문자가 "?"인지 테스트합니다. 예를 들어 다음과 같습니다.

변수 설정 [ $result ; 값: JSONFormatElements ( $$JSON ) ]
If [ Left ( $result ; 1 ) = "?" ]
   # $$JSON에 유효하지 않은 JSON 데이터가 있습니다.
End If

JSON 데이터 예제

다음 JSON 데이터 예제는 각 키 값의 쌍이 여러 개 있는 3개의 "제품" 대상체 배열의 "제과" 대상체를 포함합니다.

{
"제과" :
{
"제품" :
[
{
"id" : "FB1",
"이름" : "도너츠",
"가격": 1.99,
"재고" : 43,
"범주" : "빵",
"특별 메뉴" : true
},
{
"id" : "FB2",
"가격": 22.5,
"이름" : "초콜릿 케이크",
"재고" : 23,
"범주" : "케이크",
"특별 메뉴" : true
},
{
"id" : "FB3",
"가격": 3.95,
"이름" : "바게트",
"재고" : 34,
"범주" : "빵",
"특별 메뉴" : true
}
]
}
}

참고 

JSON 파서는 배열에서 요소의 순서를 유지하지만 대상체에 있는 요소의 순서는 유지하지 않습니다. 그러므로 JSON 함수는 대상체에 있는 요소를 지정된 순서와는 다른 순서로 반환합니다.

관련 주제 

텍스트 함수

컨테이너 함수