JSON을 객체 또는 배열로 동적으로 파싱하기
Source: Dev.to
개요
이 가이드는 Azure Logic Apps에서 데이터를 처리할 때 동일한 요소(contacts 필드)가 객체이거나 배열일 수 있는 JSON을 동적으로 파싱하는 방법을 설명합니다.
시나리오
클라이언트는 WorkflowMax에서 클라이언트 목록을 SQL로 가져와야 했습니다. 각 클라이언트 레코드에는 기본 정보와 연락처 목록이 포함됩니다. WorkflowMax는 데이터를 XML 형태로 제공하고, 이를 JSON으로 변환한 뒤 Azure Blob Storage에 저장합니다.
문제점: contacts 필드는 클라이언트에 연락처가 여러 개일 때는 배열이고, 하나만 있을 때는 단일 객체가 됩니다. 이러한 불일치 때문에 Logic App에서 JSON을 처리하기가 어려웠습니다.
샘플 JSON
여러 연락처 (배열)
{
"_id": "64fafdab0148d179b4bad3d6",
"index": 0,
"guid": "a5a30726-560b-4548-9219-d3e579ff4df0",
"name": "Joanna Stephenson",
"company": "SYNKGEN",
"contacts": [
{
"id": 0,
"name": "Church Cleveland",
"email": "churchclevelan@synkgen.com",
"age": 37
},
{
"id": 1,
"name": "Tabitha Gentry",
"email": "tabithagentry@synkgen.com",
"age": 26
}
]
}
단일 연락처 (객체)
{
"_id": "64fafdabea7f6eecf0e80b44",
"index": 1,
"guid": "3f273e26-2dec-4a56-a139-760977630590",
"name": "Lynnette Guerra",
"company": "COMTOURS",
"contacts": {
"id": 1,
"name": "Marcie Spence",
"email": "marciespence@comtours.com",
"age": 40
}
}
문제
Azure Data Factory의 복사 활동은 contacts 필드를 다음과 같이 생성합니다.
- 여러 연락처가 있을 경우 배열
- 연락처가 하나뿐일 경우 객체
Logic Apps에서는 동일한 속성이 객체와 배열 사이를 전환하는 스키마를 직접 다룰 수 없습니다.
참고 솔루션
Power Users 포럼에서 유사한 문제가 논의되었습니다:
Dynamically Parse JSON as object or Array
제안된 해결책은 런타임에 contacts 요소의 type 또는 length를 확인하고, 이를 배열로 정규화한 뒤 처리하는 것입니다.
Logic Apps 구현 단계
-
트리거 – Blob Storage에 새 JSON 파일이 생성될 때.
-
Parse JSON – Parse JSON 작업을 사용하고, contacts를 객체 배열로 정의한 스키마를 지정합니다.
-
변수 초기화 –
normalizedContacts와 같은 배열 변수를 생성합니다. -
조건 –
@length(body('Parse_JSON')?['contacts'])가 0보다 큰 숫자를 반환하는지 테스트하는 Condition 작업을 추가합니다.-
True인 경우 (contacts가 이미 배열인 경우):
@setVariable('normalizedContacts', body('Parse_JSON')?['contacts']) -
False인 경우 (contacts가 단일 객체인 경우):
@setVariable('normalizedContacts', createArray(body('Parse_JSON')?['contacts']))
-
-
For Each –
variables('normalizedContacts')를 순환하면서 각 연락처를 처리합니다(예: SQL에 upsert). -
Insert/Upsert Client – 적절한 커넥터를 사용해 최상위 클라이언트 상세 정보를 데이터베이스에 기록합니다.
주요 식(Expression) 상세
-
contacts가 배열인지 확인
@greater(length(body('Parse_JSON')?['contacts']), 0) -
단일 객체를 배열로 변환
createArray(body('Parse_JSON')?['contacts'])
결과
원본 구조와 관계없이 contacts 필드를 배열로 정규화함으로써 Logic App이 각 연락처를 안정적으로 반복(iterate)하고 필요한 데이터베이스 작업을 수행할 수 있게 되었습니다.