JSON을 객체 또는 배열로 동적으로 파싱하기

발행: (2025년 12월 29일 오전 09:15 GMT+9)
4 min read
원문: Dev.to

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 구현 단계

  1. 트리거 – Blob Storage에 새 JSON 파일이 생성될 때.

  2. Parse JSONParse JSON 작업을 사용하고, contacts를 객체 배열로 정의한 스키마를 지정합니다.

  3. 변수 초기화normalizedContacts와 같은 배열 변수를 생성합니다.

  4. 조건@length(body('Parse_JSON')?['contacts']) 가 0보다 큰 숫자를 반환하는지 테스트하는 Condition 작업을 추가합니다.

    • True인 경우 (contacts가 이미 배열인 경우):

      @setVariable('normalizedContacts', body('Parse_JSON')?['contacts'])
    • False인 경우 (contacts가 단일 객체인 경우):

      @setVariable('normalizedContacts', createArray(body('Parse_JSON')?['contacts']))
  5. For Eachvariables('normalizedContacts') 를 순환하면서 각 연락처를 처리합니다(예: SQL에 upsert).

  6. Insert/Upsert Client – 적절한 커넥터를 사용해 최상위 클라이언트 상세 정보를 데이터베이스에 기록합니다.

주요 식(Expression) 상세

  • contacts가 배열인지 확인

    @greater(length(body('Parse_JSON')?['contacts']), 0)
  • 단일 객체를 배열로 변환

    createArray(body('Parse_JSON')?['contacts'])

결과

원본 구조와 관계없이 contacts 필드를 배열로 정규화함으로써 Logic App이 각 연락처를 안정적으로 반복(iterate)하고 필요한 데이터베이스 작업을 수행할 수 있게 되었습니다.

Back to Blog

관련 글

더 보기 »