JSON 문자열과 EGL 변수 간 대응
이 주제에서는 JSON(JavaScript Object Notation) 문자열에 해당하는 EGL 레코드에 대해 설명합니다. 기타 주제에서는 써드파티 REST 서비스에 액세스하는 데 필요하듯이 Rich UI 개발자가 JSON 데이터와 변수 간 변환을 수행하는 데 사용하는 함수(serviceLib.convertFromJSON(), serviceLib.convertToJSON())에 대해 설명합니다. 각 함수에서 실패가 발생하면 RuntimeException이 발생합니다.
JSON 및 EGL 레코드
{ "EmpNo":10,"LastName":"Smith" }
Record MyRecordPart
EmpNo INT;
LastName STRING;
end
BLOB 또는 CLOB 이외의 모든 기본 유형을 사용할 수 있습니다. 또한 EGL 레코드 필드는 지원되는 기본 유형 중 하나를 기반으로 하는 DataItem 파트가 기반인 경우 올바릅니다.
{ "Emp-No":10,"LastName":"Smith" }
Record MyRecordPart
EmpNo INT; {JSONName = "Emp-No"}
LastName STRING;
end
(레코드 파트를 기반으로 하는 레코드를 선언하는 경우 JSONName의 값을 대체할 수 없습니다.)
{"Result":{"aTimestamp":1191871152}}
일반 규칙은 JSON 문자열에서 중괄호로 묶인 각 절이 EGL 레코드에 해당하는 런타임 JSON 오브젝트의 컨텐츠라는 점입니다.
Record MyTopPart
Result MyTimestampPart;
end
Record MyTimestampPart
aTimestamp BIGINT;
end
표시된 것처럼 각 JSON ID(뒤에 콜론이 표시됨)를 사용하려면 레코드에 필드가 있어야 합니다. JSON 필드 이름이 EGL 예약어(예: "TimeStamp")인 경우에는 레코드가 아니라 사전을 사용하여 serviceLib.convertFromJSON() 또는 serviceLib.convertToJSON()에 액세스해야 합니다. 이 주제에서 나중에 이 변형을 보여줍니다.
{"Menu":
{ "id": "file", "value": "File", "popup":
{"Menuitem":
[
{"value": "New", "onClick": "CreateNewDoc()"},
{"value": "Open", "onClick": "OpenDoc()"},
{"value": "Close", "onClick": "CloseDoc()"}
]
}
}
}
(이 문서에서 해당 예제와 기타 예제는 http://json.org/example.html에 있습니다.)
Record MyTopPart
Menu MyMenuPart;
end
Record MyMenuPart
id STRING;
value STRING;
popup MyPopupPart;
end
Record MyPopupPart
MenuItem MyElementPart[];
end
Record MyElementPart
value STRING;
onClick STRING;
end
JSON 문자열에 액세스할 때 레코드를 사용하는 방법을 자세히 탐색하려면 Rich UI 샘플 geocode.records를 참조하십시오.
JSON 및 EGL 사전
myRef Dictionary
{
ID = 5,
lastName = "Twain",
firstName = "Mark"
};
EGL 도움말 시스템의 "사전 파트"와 관련 주제에 설명된 대로 사전과 상호작용합니다.
{"Result":{"aTimestamp":1191871152}}
myTime Dictionary;
일반 규칙은 JSON 문자열의 중괄호 안에 있는 각 절이 EGL 사전에 해당한다는 점입니다. 예제 JSON 문자열과 관련하여 serviceLib.convertFromJSON() 함수는 첫 번째 콜론(:)의 왼쪽에 있는 기호를 사전 항목의 키로 처리합니다. 키는 Result이고 대소문자를 구분합니다. 여기서(모든 경우에서와 마찬가지로) 콜론 오른쪽의 컨텐츠는 콜론의 왼쪽에 이름이 있는 키와 연관된 값입니다.
myTime Dictionary
{
Result = new Dictionary{ aTimestamp = 1191871152 }
};
numberOfSeconds BIGINT = myTime.Result.aTimestamp;
{"Result":{"Timestamp":1191871152}}
numberOfSeconds BIGINT = myTime.Result["Timestamp"];
{"Menu":
{ "id": "file", "value": "File", "popup":
{"Menuitem":
[
{"value": "New", "onClick": "CreateNewDoc()"},
{"value": "Open", "onClick": "OpenDoc()"},
{"value": "Close", "onClick": "CloseDoc()"}
]
}
}
}
이 예제에서 사전에는 키의 이름이 Menu로 지정된 하나의 항목이 있습니다. 문자열 "id"와 그 뒤의 모든 문자열을 임베드하는 중괄호로 표시된 대로 해당 키와 연관된 값은 익명 사전입니다. 이 익명 사전에는 id, value, popup 키와 해당 키의 값이 포함되어 있습니다. popup 키가 소개하는 유형의 복잡도를 경험하지 않을 수 있지만 문제점은 해결 가능합니다. JSON 문자열 예에서 관계를 볼 수 있습니다.
고려할 질문은 다음과 같습니다. serviceLib.convertFromJSON() 함수가 이전 JSON 문자열을 myMenu 사전에 복사했다고 가정했을 때 문자열 "OpenDoc()"에 액세스하는 데 필요한 명령문은 무엇입니까?
myString STRING = myMenu.Menu.popup.MenuItem[2].onClick;
myMenu Dictionary
{ Menu = new Dictionary
{ id = "file",
value = "File",
popup = new Dictionary
{ MenuItem = new Dictionary[]
{ new dictionary {value = "New", onClick = "CreateNewDoc()" },
new dictionary {value = "Open", onClick = "OpenDoc()" },
new dictionary {value = "Close", onClick = "CloseDoc()"}
}
}
}
};
- 사전 계층 구조에 있는 각 사전은 JSON 문자열에서 중괄호 안에 있는 절에 해당합니다.
- 각 키에는 기본 값, 사전, 레코드 또는 사전이나 레코드의 배열이 지정됩니다.
JSON 문자열에 액세스할 때 사전 레코드를 사용하는 방법을 자세히 탐색하려면 Rich UI 샘플 geocode.dictionaries를 참조하십시오.
JSON 및 레코드와 사전
- 레코드를 사용하여 serviceLib.convertFromJSON()을 호출하려고 준비하는 경우
- 레코드 또는 사전을 사용하여 serviceLib.convertToJSON()을 호출하려고 준비하는 경우
{"Result":{"Timestamp":1191871152}}
Record ResultRecordPart
Result Dictionary;
end
myResult ResultRecordPart;
milliseconds BIGINT;
serviceLib.convertFromJSON(resp.body, myResult);
milliseconds = myResult.Result["Timestamp"] as BIGINT;
{"Menu":
{ "id": "file", "value": "File", "popup":
{"Menuitem":
[
{"value": "New", "onClick": "CreateNewDoc()"},
{"value": "Open", "onClick": "OpenDoc()"},
{"value": "Close", "onClick": "CloseDoc()"}
]
}
}
}
Record MyTopPart
Menu MyMenuPart;
end
Record MyMenuPart
id STRING;
value STRING;
popup Dictionary;
end
popup Dictionary
{ MenuItem = new Dictionary[]
{ new Dictionary {value = "New", onClick = "CreateNewDoc()" },
new Dictionary {value = "Open", onClick = "OpenDoc()" },
new Dictionary {value = "Close", onClick = "CloseDoc()"}
}
}
(설명을 위해 해당 사전을 표시합니다. Dictionary의 하위 구조는 serviceLib.convertToJSON()을 호출할 경우 유용하지만 serviceLib.convertFromJSON()을 호출할 경우에는 사용되지 않습니다.)
myTop MyTopPart;
itemString STRING;
serviceLib.convertFromJSON(resp.body, myTop);
itemString = myTop.Menu.popup.MenuItem[2].onClick;