JSON 구문 분석기 및 도메인

JSON (JavaScript Object Notation) 은 JavaScript 프로그래밍 언어의 서브세트를 기반으로 하는 단순 데이터 교환 형식입니다.

IBM® App Connect Enterprise JSON 도메인을 지원합니다. JSON 도메인의 메시지는 JSON 구문 분석기와 시리얼라이저로 처리합니다. JSON 구문 분석기는 JSON 문법을 사용하여 비트 스트림을 해석하고 해당 JSON 도메인 논리 메시지 트리를 생성합니다. 출력할 데이터를 처리하는 경우, JSON 시리얼라이저는 JSON 도메인 논리 메시지 트리에서 JSON 형식화 비트스트림을 생성합니다.

구문 분석 중에 JSON 스키마 파일 또는 OpenAPI 정의에 대해 JSON 메시지를 유효성 검증할 수 있습니다. 쓰기 또는 중간 플로우 중에 JSON 스키마 파일 또는 OpenAPI 정의에 대해 JSON 메시지 트리를 유효성 검증할 수 있습니다.

IBM App Connect Enterprise Toolkit 의 JSON 편집기를 사용하여 JSON 파일을 편집할 수 있습니다. 다만, 이 편집기의 유효성 검사 기능에는 여러 가지 제한 사항이 있으므로 JSON 문서의 유효성을 검사하는 데 사용해서는 안 됩니다. JSON 문서의 유효성을 검증하는 방법에 대한 정보는 JSON 유효성 검증을 참조하십시오.

JSON은 다음 두 구조를 기반으로 하는 언어 독립적 텍스트 형식입니다.
  • 다음 유형의 오브젝트(이름-값 쌍):
    • 문자열
    • 숫자
    • Boolean
  • 정렬된 값 콜렉션(배열)
오브젝트와 배열은 중첩될 수 있습니다.

JSON 구문 분석기는 JSON 오브젝트 또는 JSON 배열만 입력 비트 스트림과 출력 비트 스트림 모두에서 최상위 레벨 값 유형으로 승인합니다. JSON 문자열 리터럴, 숫자, 부울 또는 널값을 오브젝트나 배열로 임베드하기 전에는 JSON 구문 분석기를 사용하여 출력할 수 없습니다.

JSON 메시지 구조에 대한 자세한 정보는 JSON 메시지 세부사항을 참조하십시오. JSON 구문 분석기 매개변수에 대한 자세한 정보는 JSON 구문 분석기의 매개변수 값을 참조하십시오.

통합 노드가 지원하는 코드화 문자 세트 ID(CCSID)로 JSON 데이터 스트림을 구문 분석할 수 있습니다. 데이터 스트림은 JSON 구문 분석기가 입력 또는 요청 노드에서 호출될 때 전송으로 정의되거나 CREATE 함수 호출의 PARSE 절에 있는 CCSID 매개변수로 정의되는 CCSID에 따라 구문 분석됩니다. CCSID가 지정되지 않거나 값 0이 설정되는 경우, 구문 분석기가 다음 유니코드 인코딩 중 하나를 사용하는지 여부를 발견하려고 시도합니다(데이터 스트림의 처음 몇 바이트 조사).
  • UTF-8
  • UTF-16BE
  • UTF-16LE
  • UTF-32BE
  • UTF-32LE

UTF-* CCSID가 명확하게 지정되는 경우, JSON 구문 분석기는 데이터 스트림 시작 부분에서 해당 바이트 순서 표시(BOM)를 허용합니다.

JSON 데이터 스트림은 JSON 구문 분석기 루트 아래 Data 요소 아래에 있는 논리 메시지 트리로 구문 분석됩니다. 논리 트리 구조는 예제 JSON 메시지에 표시되어 있습니다.

Data 요소는 ESQL에서 JSON.Data로, Java에서™ 에서 JSON/Data로, 그래픽 데이터 맵핑 편집기 에서 사용자 정의 추가 함수를 사용하여 JSON->Data를 정의하거나 XPath에서 $Body/Data로 액세스하고 조작할 수 있습니다. JSON 구문 분석기는 JSON 문법에 따라 비트스트림이 형식화되지 않은 경우 오류를 발행합니다.

JSON 시리얼라이저는 메시지 트리를 JSON 형식 데이터 스트림으로 직렬화합니다. CCSID는 통합 노드 특성 트리로 또는 메시지 어셈블리의 전송 헤더로 정의될 수 있습니다. CCSID가 정의되지 않는 경우 시리얼라이저는 기본적으로 UTF-8 인코딩을 사용하는 HTTP 노드를 제외한 모든 노드에 큐 관리자 기본 CCSID를 사용합니다.

JSON 시리얼라이저가 ASBITSTREAM 함수 호출을 통해 호출되는 경우에는 CCSID가 CCSID 매개변수로 정의됩니다. CCSID 매개변수가 제공되지 않거나 값이 0으로 설정되면 JSON 시리얼라이저는 기본적으로 UTF-8 인코딩을 사용합니다.

JSON 도메인 메시지 트리를 비트 스트림으로 구문 분석하기 위해 구문 분석기 모드 옵션이 FolderBitStream으로 설정된 ASBITSTREAM 함수를 코딩하는 경우, 생성된 비트 스트림은 대상 요소 및 해당 하위에서 빌드되는 JSON 형식입니다.

JSON 구문 분석기로 메시지를 처리하려면 메시지 플로우의 관련 노드에서 JSONMessage Domain으로 선택하십시오. XSLTransform 노드는 JSON 도메인을 지원하지 않습니다.

통합 노드는 명시적 값이 메시지 플로우에 의해 설정되지 않는 한 JSON 메시지 트리를 직렬화할 때 HTTP Content-Type 헤더를 application/json으로 설정합니다.

JSON 오브젝트는 통합 노드 메시지 트리에서 일련의 NameValue 요소로 모델화됩니다. 구문 분석기는 비트스트림에서 멤버를 발견하는 순서대로 메시지 트리를 빌드합니다. 시리얼라이저는 트리 순서대로 비트스트림에 오브젝트 멤버를 기록합니다.

JSON 배열은 JSON.Array의 JSON 구문 분석기 특정 유형 플래그 및 정렬된 하위가 있는 이름 요소로 통합 노드 메시지 트리에서 모델링됩니다. 하위는 다음 배열 유형 중 하나일 수 있습니다.
  • 단순 값을 포함하는 배열. 예를 들어, 다음과 같습니다.
    "array1" : [ "thing1", 1 ]
    다음 메시지 트리가 생성됩니다.
    (0x01001000:Array): array1 = (  
        (0x03000000:NameValue):Item = 'thing1' (CHARACTER)
        (0x03000000:NameValue):Item = 1 (INTEGER)
     )

    JSON 구문 분석기는 Item 이름을 NameValue 요소에 지정합니다.

  • 오브젝트를 포함하는 배열. 예를 들어, 다음과 같습니다.
    "array2" : [ {"a" : 1}, {"b" : 2} ]
    다음 메시지 트리가 생성됩니다.
    (0x01001000:Array):array2 = (
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):a = 1 (INTEGER)
      )
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):b = 2 (INTEGER)
      )
    )
  • 다음과 같은 다차원 배열:
    "array3" : [ [1.1], [2.1] ]
    다음 메시지 트리가 생성됩니다.
    (0x01001000:Array):array3 = (
      (0x01001000:Array):Item = (
        (0x03000000:NameValue):Item = 1.1E+0 (FLOAT)
      )
      (0x01001000:Array):Item = (
        (0x03000000:NameValue):Item = 2.1E+0 (FLOAT)
      )
    )

JSON 메시지 예

다음 예는 단순 JSON 메시지를 보여줍니다.

{
    "name" : "John Doe",
    "age" : -1.0,
    "known" : false,
    "address" : { "street" : null,
                  "city" : "unknown" },
    "belongings" : ["item1", "item2", "item3"]
}

이 JSON 입력은 다음 통합 노드 논리 메시지 트리를 생성합니다.

(0x01000000:Object):JSON            = ( ['json' : 0xd55fc8]
  (0x01000000:Object):Data = (
    (0x03000000:NameValue):name       = 'John Doe' (CHARACTER)
    (0x03000000:NameValue):age        = -1E+0 (FLOAT)
    (0x03000000:NameValue):known      = FALSE (BOOLEAN)
    (0x01000000:Object   ):address    = (
      (0x03000000:NameValue):street = NULL
      (0x03000000:NameValue):city   = 'unknown' (CHARACTER)
    )
    (0x01001000:Array    ):belongings = (
      (0x03000000:NameValue):Item = 'item1' (CHARACTER)
      (0x03000000:NameValue):Item = 'item2' (CHARACTER)
      (0x03000000:NameValue):Item = 'item3' (CHARACTER)
    )
  )
)