Transformando dados JSON heterogêneos em um mapa de mensagens

No editor de Mapeamento de Dados Gráficos, você pode usar a função Add User-Defined para transformar dados JSON heterogêneos.

Antes de Começar

Crie um mapa de mensagem com o domínio de saída configurado para JSON. Para obter mais informações, consulte Modelando graficamente uma mensagem JSON em um mapa de mensagem

Sobre esta tarefa

A abordagem para modelar dados JSON heterogêneos é definir cada estrutura como uma união de dados diferentes que podem estar presentes em cada formato possível. Em seguida, configure os dados, que estão presentes em algumas instâncias de dados, como opcionais.

Por padrão, ao se modelar dados JSON no editor de Mapeamento de Dados Gráficos, você cria objetos e matrizes em que todas as instâncias são iguais. Todos os objetos com o mesmo nome possuem o mesmo conjunto de campos de dados e todas as entidades em uma matriz possuem o mesmo conjunto de campos de dados. Esse caso de uso corresponde ao uso mais comum de formatos de dados JSON.

O JSON permite que as entradas nas matrizes JSON tenham estrutura e tipos diferentes. Para Objetos JSON, alguns aplicativos JSON também podem permitir o mesmo nome para objetos ou valores contidos que podem então ter estrutura e tipos diferentes. A especificação JSON diz claramente que: Os nomes dentro de um objeto DEVEM ser exclusivos. Para obter mais informações, consulte O JavaScript Object Notation (JSON) Data Interchange Format). Utilize este formato apenas se for exigido pelos aplicativos externos. Esse formato de dados JSON são chamados de dados JSON heterogêneos.

Se você tiver um esquema JSON para seus dados da mensagem, será possível usar isso conforme descrito em Criando ou transformando uma mensagem JSON usando um esquema JSON. Como alternativa, é possível modelar dados JSON heterogêneos usando a função Incluir definido pelo usuário conforme descrito neste tópico ou é possível usar um modelo de esquema XML equivalente conforme descrito em Modelando uma mensagem JSON para uso em um mapa de mensagem usando um modelo de esquema XML equivalente.

No editor de Mapeamento de Dados Gráficos, as regras a seguir aplicam-se quando você modelo uma matriz JSON heterogênea:
  • Todas as entradas na matriz devem conter objetos ou valores.
  • Você pode modelar matrizes de objeto de dados JSON heterogêneas usando a função Add User-Defined .
  • Para modelar matrizes de valores JSON heterogêneas, em que o tipo de cada instância pode variar, deve-se usar um esquema externo para fornecer o tipo do elemento Item que representa cada entrada de valor na matriz.

Procedimento

Complete as seguintes etapas para modelar dados JSON heterogêneos no editor de Mapeamento de Dados Gráficos:

  1. Construa uma união de campos de dados possíveis e configure os elementos que não existirem em cada instância como opcionais.
    1. Use a função Add User-Defined para adicionar elementos definidos pelo usuário ao mapa.
    2. Na página Propriedades de cada elemento, configure a guia Geral do elemento para configurar a ocorrência mínima para 0 para que o elemento seja opcional.

    Como alternativa, é possível usar um esquema externo para fornecer o tipo do elemento Item que representa cada entrada de valor na matriz. O tipo pode ser definido como uma união de esquema de tipos simples ou um xsd:anySimpleType.

  2. Para modelar um objeto JSON com os mesmos objetos contidos mas diferentes digitados, adiciam o objeto uma vez e, em seguida, configuram a ocorrência máxima de sua cardinalidade para indicar o número de ocorrências. O único objeto é uma união do conteúdo possível.
  3. Use mapeamentos condicionais para ler ou construir os dados de saída em cada instância. Para obter mais informações, consulte Escolhendo uma conversão para definir um mapeamento condicional.

    Ao mapear para um valor JSON heterogêneo modelado como uma união de tipos possíveis, assegure-se de que os dados ou valor de entrada que são retornados da conversão sejam do tipo que é necessário para a instância que está sendo configurada. Você pode usar as funções de elenco xs: < type> para configurar o tipo de dado que é necessário.

Exemplo

Esse exemplo mostra como transformar uma mensagem de objeto JSON, que descreve um veículo que usa dois objetos de dados JSON heterogêneos com valores nomeados diferentes, em uma mensagem de matriz JSON heterogênea, em que cada entrada é um objeto de dados com valores nomeados diferentes.

O aplicativo de entrada produz uma mensagem de objeto JSON heterogênea que descreve um veículo que usa dois objetos de dados JSON heterogêneos. Cada objeto de dados JSON é chamado de atributo e contém elementos de nome e valor diferentes. Os dados JSON de entrada são os seguintes:


{ "Description" : {
      "attribute"  : {
          "colour" : "blue",
          "metallic" : true
      },
      "attribute"  : {
          "capacity" : 1.4,
          "fuel" : "diesel"
      }
  }
}
No mapa, o objeto Description é modelado com um objeto de atributo que pode ocorrer duas vezes (máximo de ocorrências configurado para 2).
  • O objeto de atributo heterogêneo contém os pares nome-valores colour e metallic ou capacity e fuel.
  • Cada um dos pares nomes-valores é modelado como opcional (ocorrência mínima configurada para 1).

Mostra a mensagem de entrada

O aplicativo de destino requer essas informações como uma matriz JSON heterogênea:

[{"attributeType":"Paint","colour":"blue","metallic":true},
{"attributeType":"Engine","capacity":1.4E+0,"fuel":"diesel"}]
No mapa, a matriz JSON de saída é definida como a união dos campos de dados possíveis:
  • A matriz é representada por um objeto JSON do tipo Anônimo.
  • O primeiro elemento é um elemento attributeType único e necessário. Todas as entradas na matriz contêm esse elemento nome-valor.
  • Os outros elementos nome-valor são colour, metallic, capacity e fuel. Esses elementos não ocorrem em todas as entidades na matriz. Todos esses elementos são definidos como opcionais. Cada elemento possui sua propriedade ocorrência mínima configurada para 0.

Mostra a mensagem de saída

Para transformar a entrada na saída necessária, use a conversão Para Cada para criar cada uma das entradas na matriz a partir dos mesmos objetos de entrada de atributo (de repetição) nomeados.

Mostra o Para cada transformação entre a entrada e a mensagem de saída

Dentro do mapa aninhado associado à conversão Para Cada, defina uma conversão If que verifica se o elemento attribute contém colour ou capacity.
  1. É possível definir a condição If para verificar colour: $attribute2/colour. Quando esta expressão é avaliada como true, a conversão no mapa aninhado associado a If é aplicada.
  2. O caminho Else não requer uma condição. Quando a expressão If é avaliada como false, a conversão no mapa aninhado associado a Else é aplicada.

Mostra o mapa aninhado da transformação Append entre a entrada e a mensagem de saída

O mapa aninhado que está associado à conversão If configura o elemento attributeType para Paint e copia o valor dos outros elementos inalterados.

Mostra o mapa fist local da transformação Append entre a entrada e a mensagem de saída

O outro mapa aninhado que está associado a Else configura o elemento attributeType para Engine e copia o valor dos outros elementos inalterados.

Mostra o segundo mapa local da transformação Append entre a entrada e a mensagem de saída

Ao executar esse mapa, você obtém a seguinte mensagem JSON:
[{"attributeType":"Paint","colour":"blue","metallic":true},
{"attributeType":"Engine","capacity":1.4E+0,"fuel":"diesel"}]
Você obtém a seguinte estrutura de árvore de saída:
  
(0x01000000:Object):JSON       = ( ['json' : 0x298f1e00]
    (0x01001000:Array):Data = (
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):attributeType = 'Paint' (CHARACTER)
        (0x03000000:NameValue):colour        = 'blue' (CHARACTER)
        (0x03000000:NameValue):metallic      = TRUE (BOOLEAN)
      )
      (0x01000000:Object):Item = (
        (0x03000000:NameValue):attributeType = 'Engine' (CHARACTER)
        (0x03000000:NameValue):capacity      = 1.4E+0 (FLOAT)
        (0x03000000:NameValue):fuel          = 'diesel' (CHARACTER)
      )
    )
  )

O que fazer em seguida

Implemente o mapa da mensagem e verifique se a mensagem de saída é válida. Para obter mais informações, consulte Resolução de problemas de um mapa de mensagens..