Analizador y dominio JSON

JSON (JavaScript Object Notation) es un formato simple de intercambio de datos basado en un subconjunto del lenguaje de programación JavaScript.

IBM® Integration Bus proporciona soporte para un dominio JSON. Los mensajes del dominio JSON los procesa el analizador y serializador JSON. El analizador JSON interpreta una secuencia de bits utilizando la gramática JSON y genera un árbol lógico de mensajes del dominio JSON correspondiente. Al procesar datos de salida, el serializador JSON genera una corriente de datos con formato JSON a partir de un árbol lógico de mensajes del dominio JSON.

El analizador y serializador JSON no dan soporte a la validación de mensajes porque el modelo de mensajes JSON no está soportado.

JSON es un formato de texto independiente del lenguaje, basado en dos estructuras:
  • Objetos (pares de nombre y valor) con los tipos siguientes:
    • Serie
    • Número
    • Booleano
    • Nulo
  • .Colecciones ordenadas de valores (matrices)
Los objetos y matrices pueden estar anidados.

El analizador JSON solo acepta un objeto JSON o una matriz JSON como el tipo de valor de nivel superior en una corriente de bits de entrada y en una corriente de bits de salida. No se puede utilizar el analizador JSON para que la salida sea un literal de un valor de serie JSON, número, booleano o valor nulo sin incluirlo antes en un objeto o matriz.

Para obtener más información sobre la estructura de mensajes JSON, consulte Detalles del mensaje JSON.

Las corrientes de datos JSON se pueden analizar a partir de cualquier ID de juego de caracteres codificado (CCSID) que esté soportado por el nodo de integración. La corriente de datos se analiza de acuerdo con el CCSID definido por el transporte cuando el analizador JSON se invoca desde un nodo de entrada o solicitud o definida por el parámetro CCSID en una cláusula PARSE en una llamada de función CREATE. Si no se especifica ningún CCSID, o si se establece un valor de 0, el analizador intenta detectar (examinando los primeros bytes de la corriente de datos) si se utiliza una de los siguientes codificaciones Unicode:
  • UTF-8
  • UTF-16BE
  • UTF-16LE
  • UTF-32BE
  • UTF-32LE

Si se especifica un CCSID UTF-* de manera explícita, el analizador JSON tolera el correspondiente Byte Order Mark (BOM) al principio de la corriente de datos.

Las corrientes de datos JSON se analizan en un árbol de mensajes lógico bajo laDataEl elemento siguienteJSONraíz de analizador. La estructura de árbol lógico se muestra en Ejemplo de mensaje JSON.

ElDatase puede acceder a un elemento y manipularlo desde ESQL comoJSON.Data, desde Java™ comoJSON/Data, desde Editor de correlaciones de datos gráficas utilizando la función Añadir definido por el usuario para definirJSON->Data, o de XPath como$Body/Data. El analizador JSON emite un error si no se da formato a una corriente de bits de acuerdo con la gramática JSON.

El serializador JSON serializa árboles de mensaje en una corriente de datos de formato JSON. El CCSID se puede definir por el árbol de propiedades del nodo de integración o por las cabeceras de transporte en el conjunto de mensajes. Si no se define ningún CCSID, el serializador adopta el CCSID del gestor de colas predeterminado para todos los nodos excepto los nodos HTTP, que toman el valor predeterminado de codificación UTF-8.

Cuando se invoca el serializador JSON a través de unASBITSTREAMllamada de función, el CCSID se define mediante el parámetro CCSID. Si no se proporciona ningún parámetro CCSID, o si el valor se establece en 0, el serializador JSON toma como valor predeterminado la codificación UTF-8.

Para procesar mensajes con el analizador JSON, seleccione JSON como Dominio de mensajes en el nodo pertinente del flujo de mensajes. El nodo XSL no da soporte al dominio JSON.

El nodo de integración establece la cabecera HTTP Content-Type enapplication/jsonal serializar un árbol de mensajes JSON, a menos que el flujo de mensajes establezca un valor explícito.

Los objetos JSON se modelan en el árbol de mensajes del nodo de integración como una secuencia de elementos NameValue. El analizador crea el árbol de mensajes en el orden en que se encuentra los miembros en la corriente de bits. El serializador escribe los miembros del objeto en la corriente de bits en el orden de árbol.

Las matrices JSON se modelan en el árbol de mensajes del nodo de integración como un elemento Name con un distintivo JSON específico de analizador de matriz JSON e hijos ordenados. Los hijos pueden ser cualquiera de los siguientes tipos de matriz:
  • Una matriz que contiene valores simples; por ejemplo:
    "array1" : [ "thing1", 1 ]
    Se genera el árbol de mensaje siguiente:
    (0x01001000:Array): array1 = (  
        (0x03000000:NameValue):Item = 'thing1' (CHARACTER)
        (0x03000000:NameValue):Item = 1 (INTEGER)
     )

    El analizador JSON asigna el nombreItema los elementos de Valor de nombre .

  • Una matriz que contiene objetos; por ejemplo:
    "array2" : [ {"a" : 1}, {"b" : 2} ]
    Se genera el árbol de mensaje siguiente:
    (0x01001000:Array):array2 = (
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):a = 1 (INTEGER)
      )
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):b = 2 (INTEGER)
      )
    )
  • Una matriz multidimensional; por ejemplo:
    "array3" : [ [1.1], [2.1] ]
    Se genera el árbol de mensaje siguiente:
    (0x01001000:Array):array3 = (
      (0x01001000:Array):Item = (
        (0x03000000:NameValue):Item = 1.1E+0 (FLOAT)
      )
      (0x01001000:Array):Item = (
        (0x03000000:NameValue):Item = 2.1E+0 (FLOAT)
      )
    )

Mensaje JSON de ejemplo

El ejemplo siguiente muestra un mensaje JSON simple:

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

Esta entrada JSON genera el siguiente árbol lógico de mensajes de nodo de integración:

(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)
    )
  )
)