JSON 함수 작업하기
FileMaker Pro는 사용자의 맞춤형 App이 다른 소스(예: REST API를 통해 JSON 포맷 데이터를 전송하는 웹 서비스)의 JSON 데이터를 분석하고 수정할 수 있게 하는 몇 가지 텍스트 함수를 제공합니다.
JSON 데이터 포맷에 대한 자세한 정보는 json.org를 참조하십시오.
JSON 데이터 포맷 설정하기
JSON 데이터는 요소 사이에 공백이나 라인 엔딩이 필요하지 않습니다. 하지만 문제를 디버그하는 동안 데이터를 읽기 쉽게 하려면 JSONFormatElements 함수를 사용합니다. 이는 JSON 데이터 예제에 있는 것처럼 탭과 라인 엔딩 문자를 추가해 줍니다.
JSON 데이터 분석하기
다음 JSON 함수를 사용하여 JSON 데이터(더 작업할 수 있는 키, 값 또는 전체 JSON 대상체 또는 배열)를 분석합니다.
-
JSONGetElement – 요소의 JSON 데이터에 쿼리 수행(대상체, 배열 또는 값)
-
JSONListKeys – 대상체 이름(키) 나열 또는 JSON 데이터의 인덱스 배열
-
JSONListValues – JSON 데이터의 값 나열
이 함수의 첫 번째 매개 변수 json
은 유효한 JSON 데이터를 포함하는 텍스트 필드, 변수 또는 텍스트 표현식을 지정하여 수행합니다.
두 번째 매개 변수, 키 또는 인덱스 또는 경로
는 JSON 데이터의 부분이 다음을 수행하도록 지정합니다.
-
키 – JSON 대상체의 키 이름
-
인덱스 - JSON 배열에 있는 요소의 인덱스(첫 번째 요소의 인덱스는 0임)
-
경로 - 키 이름, 배열 인덱스 또는 둘 모두의 계층형 문자열
키 또는 인덱스 또는 경로
매개 변수에 대해 다음 2개의 구문 유형(점 표기법 및 괄호 표기법)이 지원됩니다.
|
의미 |
|
점 표기법 | 괄호 표기법 | |
---|---|---|
"." |
"" |
첫 번째 문자인 경우 루트 레벨(점 표기법 선택 사항) |
".[n]" |
"[n]" |
루트 레벨에 있는 배열의 인덱스 n에 있는 요소 |
".name" |
"['name']" |
루트 레벨에 있는 name이라는 이름의 대상체의 키 |
".nameA.nameB.nameC" |
"['nameA']['nameB']['nameC']" |
nameB와 nameA의 하위 항목인 nameC이라는 이름의 대상체 |
".[3][2][1]nameA[0]" |
"[3][2][1]['nameA'][0]" |
nameA 대상체(중첩된 배열 세트의 레벨 3에 있음)에 있는 배열의 첫 번째 요소 |
점 표기법과 괄호 표기법의 차이점은 괄호 표기법이 마침표(.)를 사용하여 키 이름을 구분하는 대신 작은 따옴표(')와 괄호([])로 키 이름을 둘러싼다는 것입니다. 키 또는 인덱스 또는 경로
에서 두 표기법 중 하나를 사용할 수 있습니다. 하지만 키 이름에 마침표가 포함되어 있는 경우 JSON 파서가 전체 키 이름을 올바르게 식별할 수 있도록 괄호 표기법을 사용해야 합니다. 예를 들어 JSON 대상체의 루트에 있는 키가 "layout.response"인 경우, 키 또는 인덱스 또는 경로
는 "['layout.response']"입니다.
다음의 예제 스크립트는 JSON 배열의 각 제품에 대해 하나의 레코드를 생성합니다. JSON 데이터 예제가 $$JSON 변수에 저장되어 있다고 가정하면, 스크립트는 JSONListValues를 사용하여 값 목록으로 제품 배열의 콘텐츠를 가져오며 ValueCount를 사용하여 목록에 있는 제품의 수를 판단합니다. 매번 루프를 통해 제품 레코드를 생성하면서 스크립트는 GetValue를 사용하여 목록의 제품에 대한 JSON 대상체를 가져오며 JSONGetElement를 사용하여 얻은 값을 매기는 필드를 설정합니다. JSON 함수는 전달된 JSON 대상체 전체를 분석하므로 여러 번 반복되는 루프 내의 작은 JSON 대상체에 대해 JSON 함수를 사용하는 것이 더욱 효율적일 수 있습니다.
변수 설정 [ $ProductList ; 값: JSONListValues ( $$JSON ; "제과.제품" ) ]
변수 설정 [ $ProductCount ; 값: ValueCount ( $ProductList ) ]
변수 설정 [ $i; 값: 1 ]
If [ $ProductCount > 0 ]
Loop
새로운 레코드/요청
변수 설정 [ $Product ; 값: GetValue ( $ProductList ; $i ) ]
필드 설정 [ 제품::ID ; JSONGetElement ( $Product ; "id" ) ]
필드 설정 [ 제품::가격 ; JSONGetElement ( $Product ; "가격" ) ]
필드 설정 [ 제품::재고 ; JSONGetElement ( $Product ; "재고" ) ]
레코드/요청 커밋 [ 대화상자 사용: 끔 ]
변수 설정 [ $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 데이터를 사용하기 전에 데이터가 유효한지 확인하려면 JSONGetElementType 함수를 사용하고 전체 대상체가 JSON 대상체인지 테스트합니다. 예를 들어 다음과 같습니다.
변수 설정 [ $result ; 값: JSONGetElementType ( $$JSON, "" ) ]
If [ $result ≠ JSONObject ]
# $$JSON에 유효하지 않은 JSON 데이터가 있습니다.
End If
웹 서비스에서 JSON 데이터 검색하기
URL에서 삽입 스크립트 단계를 사용하여 웹 서비스에 접근하고, 검색하려는 정보에 대한 매개 변수를 지정하고, HTTP 헤더를 전송 및 수신하고, 결과를 변수나 필드로 저장합니다.
예를 들어 제과에서 JSON 포맷으로 REST API를 통해 클라이언트가 사용할 수 있는 제품 목록을 만듭니다. 다음은 $$JSON 변수의 JSON 데이터로 오늘의 특별 메뉴 목록을 반환합니다.
변수 설정 [ $url ; "https://bakery.example.com/rest/api/products" ]
URL에서 삽입 [ 대화상자 사용: 끔; 대상: $$JSON ; $url ; SSL 인증서 확인 ; cURL 옵션: "--data 목록=특별 메뉴" ]
$$JSON에 반환된 데이터는 JSON 데이터 예제를 참조하십시오.
FileMaker Pro는 일부 REST API에서 필요한 문자 인코딩 및 암호화된 서명을 처리하는 몇 가지 유틸리티 함수도 제공합니다.
JSON 데이터 예제
다음 JSON 데이터 예제는 각 키 값의 쌍이 여러 개 있는 3개의 "제품" 대상체 배열의 "제과" 대상체를 포함합니다.
{
"제과" :
{
"제품" :
[
{
"id" : "FB1",
"이름" : "도너츠",
"가격" : 1.99,
"재고" : 43,
"범주" : "빵",
"특별 메뉴" : true
},
{
"id" : "FB2",
"가격" : 22.5,
"이름" : "초콜릿 케이크",
"재고" : 23,
"범주" : "케이크",
"특별 메뉴" : true
},
{
"id" : "FB3",
"가격" : 3.95,
"이름" : "바게트",
"재고" : 34,
"범주" : "빵",
"특별 메뉴" : true
}
]
}
}
참고
-
JSON 파서는 배열에서 요소의 순서를 유지하지만 대상체에 있는 요소의 순서는 유지하지 않습니다. 그러므로 JSON 함수는 대상체에 있는 요소를 지정된 순서와는 다른 순서로 반환합니다.
-
JSON 데이터에서는 사용자의 컴퓨터 시스템 포맷이나 FileMaker Pro 파일이 생성되었을 때 사용된 포맷에서 지정된 구분 기호와 상관없이, 소수 값은 반드시 소수 구분 기호로 마침표(".")를 사용해야 합니다.