Política XMLtoJSON

Esta página aplica-se ao Apigee e ao Apigee Hybrid.

Veja a documentação do Apigee Edge.

Ícone de política

O quê

Esta política converte mensagens do formato de linguagem de marcação extensível (XML) para JavaScript Object Notation (JSON), o que lhe dá várias opções para controlar a forma como as mensagens são convertidas.

Partindo do princípio de que a intenção é converter uma resposta formatada em XML numa resposta formatada em JSON, a política seria anexada a um fluxo de resposta (por exemplo, Response / ProxyEndpoint/PostFlow).

Esta política é uma política padrão e pode ser implementada em qualquer tipo de ambiente. Para obter informações sobre os tipos de políticas e a disponibilidade com cada tipo de ambiente, consulte Tipos de políticas.

Acerca de

Num cenário de mediação típico, uma política de JSON para XML no fluxo de pedidos de entrada é frequentemente combinada com uma política de XML para JSON no fluxo de respostas de saída. Ao combinar políticas desta forma, pode expor uma API JSON para serviços de back-end que suportam nativamente apenas XML.

Para cenários em que as APIs são consumidas por diversas apps de cliente que podem exigir JSON ou XML, o formato de resposta pode ser definido dinamicamente configurando políticas de JSON para XML e de XML para JSON para execução condicional. Consulte as variáveis e condições do fluxo para uma implementação deste cenário.


Amostras

Para uma discussão detalhada sobre a conversão entre JSON e XML, consulte este artigo.

Converter uma resposta

<XMLToJSON name="ConvertToJSON">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

Esta configuração, que é a configuração mínima necessária para converter XML em JSON, usa uma mensagem de resposta formatada em XML como origem e, em seguida, cria uma mensagem formatada em JSON preenchida na OutputVariable response. O Apigee usa automaticamente o conteúdo desta variável como a mensagem para o passo de processamento seguinte.


Referência do elemento

Seguem-se os elementos e os atributos que pode configurar nesta política.

<XMLToJSON async="false" continueOnError="false" enabled="true" name="XML-to-JSON-1">
    <DisplayName>XML to JSON 1</DisplayName>
    <Source>response</Source>
    <OutputVariable>response</OutputVariable>
    <Options>
        <RecognizeNumber>true</RecognizeNumber>
        <RecognizeBoolean>true</RecognizeBoolean>
        <RecognizeNull>true</RecognizeNull>
        <NullValue>NULL</NullValue>
        <NamespaceBlockName>#namespaces</NamespaceBlockName>
        <DefaultNamespaceNodeName>&</DefaultNamespaceNodeName>
        <NamespaceSeparator>***</NamespaceSeparator>
        <TextAlwaysAsProperty>true</TextAlwaysAsProperty>
        <TextNodeName>TEXT</TextNodeName>
        <AttributeBlockName>FOO_BLOCK</AttributeBlockName>
        <AttributePrefix>BAR_</AttributePrefix>
        <OutputPrefix>PREFIX_</OutputPrefix>
        <OutputSuffix>_SUFFIX</OutputSuffix>
        <StripLevels>2</StripLevels>
        <TreatAsArray>
            <Path unwrap="true">teachers/teacher/studentnames/name</Path>
        </TreatAsArray>
    </Options>
    <!-- Use Options or Format, not both -->
    <Format>yahoo</Format>
</XMLToJSON>

Atributos <XMLtoJSON>

<XMLtoJSON async="false" continueOnError="false" enabled="true" name="XML-to-JSON-1">

A tabela seguinte descreve os atributos comuns a todos os elementos principais de políticas:

Atributo Descrição Predefinição Presença
name

O nome interno da política. O valor do atributo name pode conter letras, números, espaços, hífenes, sublinhados e pontos finais. Este valor não pode exceder 255 carateres.

Opcionalmente, use o elemento <DisplayName> para etiquetar a política no editor de proxy da IU de gestão com um nome diferente em linguagem natural.

N/A Obrigatória
continueOnError

Definido como false para devolver um erro quando uma política falha. Este comportamento é o esperado para a maioria das políticas.

Definido como true para que a execução do fluxo continue mesmo depois de uma política falhar. Veja também:

falso Opcional
enabled

Defina como true para aplicar a política.

Defina como false para desativar a política. A política não é aplicada, mesmo que permaneça associada a um fluxo.

verdadeiro Opcional
async

Este atributo foi descontinuado.

falso Descontinuado

Elemento <DisplayName>

Use em conjunto com o atributo name para etiquetar a política no editor de proxy da IU de gestão com um nome diferente em linguagem natural.

<DisplayName>Policy Display Name</DisplayName>
Predefinição

N/A

Se omitir este elemento, é usado o valor do atributo name da política.

Presença Opcional
Tipo String

Elemento <Source>

A variável que especifica a mensagem XML que quer converter em JSON.

O cabeçalho Content-type HTTP da mensagem de origem tem de estar definido como application/xml. Caso contrário, a política não é aplicada.

Se <Source> não estiver definido, é tratado como message, que é resolvido como request quando a política está anexada a um fluxo de pedidos ou response quando a política está anexada a um fluxo de respostas.

Se a variável de origem não puder ser resolvida ou for resolvida para um tipo que não seja de mensagem, a política gera um erro.

<Source>response</Source>
Predefinição O valor do elemento Source
Presença Opcional
Tipo Mensagem

Elemento <OutputVariable>

Especifica onde armazenar o resultado da conversão do formato XML para JSON. Normalmente, este elemento não está incluído na configuração da política.

O Apigee analisa o payload da mensagem XML especificada em Source, converte-o em JSON, armazena o resultado no payload de OutputVariable e define o cabeçalho Content-type HTTP da mensagem OutputVariable como application/json.

Se OutputVariable não for especificado, o valor de Source é usado por predefinição. Por exemplo, se o valor de source for response, o valor de OutputVariable é predefinido como response.

<OutputVariable>response</OutputVariable>
Predefinição A mensagem especificada em Source
Presença Opcional
Tipo Mensagem

<Options>

As opções dão-lhe controlo sobre a conversão de XML para JSON. Use o grupo <Options>, que lhe permite adicionar definições de conversão específicas, ou o elemento <Format>, que lhe permite fazer referência a um modelo de opções predefinidas. Não pode usar <Options> e <Format> ao mesmo tempo.

O campo <Options> é obrigatório se o campo <Format> não for usado.

Elemento <RecognizeNumber>

Se for verdadeiro, os campos numéricos na carga útil XML mantêm o formato original.

<RecognizeNumber>true</RecognizeNumber>

Considere o seguinte exemplo de XML:

<a>
  <b>100</b>
  <c>value</c>
</a>

Se RecognizeNumber for true, a política converte-o no seguinte:

{
    "a": {
        "b": 100,
        "c": "value"
    }
}

Se RecognizeNumber for false, a política converte-o no seguinte:

{
  "a": {
    "b": "100",
    "c": "value"
  }
}
Predefinição falso
Presença Opcional
Tipo Booleano

Elemento <RecognizeBoolean>

Permite que a conversão mantenha os valores booleanos verdadeiro/falso em vez de transformar os valores em strings.

<RecognizeBoolean>true</RecognizeBoolean>

Para o seguinte exemplo de XML:

<a>
  <b>true</b>
  <c>value</c>
</a>

Se RecognizeBoolean for true, a política converte-o no seguinte:

{
    "a": {
        "b": true,
        "c": "value"
    }
}

Se RecognizeBoolean for false, a política converte-o no seguinte:

{
    "a": {
        "b": "true",
        "c": "value"
    }
}
Predefinição falso
Presença Opcional
Tipo Booleano

Elemento <RecognizeNull>

Permite converter valores vazios em valores nulos.

<RecognizeNull>true</RecognizeNull>

Para o seguinte XML:

<a>
  <b></b>
  <c>value</c>
</a>

Se RecognizeNull for true e não existir a opção NullValue , este XML é convertido em:

{
  "a": {
    "b": null,
    "c": "value"
  }
}

Se RecognizeNull for false, este XML é convertido em:

{
  "a": {
    "b": {},
    "c": "value"
  }
}
Predefinição falso
Presença Opcional
Tipo Booleano

Elemento <NullValue>

Indica o valor para o qual os valores nulos reconhecidos na mensagem de origem devem ser convertidos. Por predefinição, o valor é null. Esta opção só é eficaz se RecognizeNull for verdadeira.

<NullValue>not-present</NullValue>

Para o seguinte XML:

<a>
  <b></b>
  <c>value</c>
</a>

Se RecognizeNull for true e NullValue não for especificado, este XML é convertido em:

{
  "a": {
    "b": null,
    "c": "value"
  }
}

Se RecognizeNull for true e NullValue for not-present, este XML é convertido em:

{
  "a": {
    "b": "not-present",
    "c": "value"
  }
}
Predefinição null
Presença Opcional
Tipo String

Opções de espaço de nomes

Por predefinição, esta política omite os espaços de nomes XML no JSON gerado. Para especificar que os espaços de nomes no documento XML devem ser traduzidos para o JSON gerado, use estes elementos em conjunto.

<NamespaceBlockName>#namespaces</NamespaceBlockName>
<DefaultNamespaceNodeName>&</DefaultNamespaceNodeName>
<NamespaceSeparator>***</NamespaceSeparator>

Considere o seguinte exemplo de XML:

<a xmlns="http://ns.com" xmlns:ns1="http://ns1.com">
  <ns1:b>value</ns1:b>
</a>

Se NamespaceSeparator não for especificado, é gerada a seguinte estrutura JSON:

{
    "a": {
        "b": "value"
    }
}

Se os elementos NamespaceBlockName, DefaultNamespaceNodeName e NamespaceSeparator forem especificados como #namespaces, & e ***, respetivamente, é gerada a seguinte estrutura JSON:

{
    "a": {
        "#namespaces": {
            "&": "http://ns.com",
            "ns1": "http://ns1.com"
        },
        "ns1***b": "value"
    }
}
Predefinição Nenhum. Se <NamespaceBlockName> não for especificado, a política vai gerar JSON de saída que não se refere a nenhum espaço de nomes XML, independentemente de a mensagem de origem se referir a espaços de nomes.
Presença Opcional
No entanto, se especificar <NamespaceBlockName>, também tem de especificar os outros dois elementos.
Tipo Strings

Opções de texto

Use estes elementos em conjunto.

      <TextAlwaysAsProperty>true|false</TextAlwaysAsProperty>
      <TextNodeName>TEXT</TextNodeName>

Quando a política encontra um elemento XML que contém apenas um único nó de texto como filho, a política traduz o conteúdo de texto desse elemento XML numa propriedade no hash JSON.

Quando a política encontra um elemento XML que contém vários filhos de conteúdo misto, estas opções permitem-lhe controlar o JSON de saída de quaisquer nós de texto filhos.

Por exemplo, considere esta configuração de política:

<XMLToJSON name='XMLToJSON-1'>
  <Options>
    <TextAlwaysAsProperty>???</TextAlwaysAsProperty>
    <TextNodeName>#text</TextNodeName>
  </Options>
</XMLToJSON>

Para as entradas XML fornecidas, a política gera estas saídas, consoante TextAlwaysAsProperty seja true ou false:

Introdução de XML Saída JSON
quando TextAlwaysAsProperty é false quando TextAlwaysAsProperty é true
<a>value1</a>
{
  "a": "value1"
}
{
  "a": {
    "#text": "value1"
  }
}
<a>value1
  <b>value2</b>
</a>
{
  "a": {
    "#text": "value1\n",
    "b": "value2"
  }
}
{
  "a": {
    "#text": "value1\n",
    "b": {
      "#text": "value2"
    }
  }
}
Predefinição <TextAlwaysAsProperty>: false
<TextNodeName>: (string em branco)
Presença Opcional
Tipo <TextAlwaysAsProperty>: booleano
<TextNodeName>: string

Opções de atributos

Estes elementos, em conjunto, permitem-lhe agrupar valores de atributos num bloco JSON e acrescentar prefixos aos nomes dos atributos.

<AttributeBlockName>FOO_BLOCK</AttributeBlockName>
<AttributePrefix>BAR_</AttributePrefix>

Considere o seguinte exemplo de XML:

<a attrib1="value1" attrib2="value2"/>

Se ambos os atributos (AttributeBlockName e AttributePrefix) forem especificados conforme definido no exemplo de XML para JSON, é gerada a seguinte estrutura JSON:

{
  "a": {
    "FOO_BLOCK": {
      "BAR_attrib1": "value1",
      "BAR_attrib2": "value2"
    }
  }
}

Se apenas AttributeBlockName for especificado, é gerada a seguinte estrutura JSON:

{
    "a": {
        "FOO_BLOCK": {
            "attrib1": "value1",
            "attrib2": "value2"
        }
    }
}

Se apenas AttributePrefix for especificado, é gerada a seguinte estrutura JSON:

{
    "a": {
        "BAR_attrib1": "value1",
        "BAR_attrib2": "value2"
    }
}

Se não for especificado nenhum, é gerada a seguinte estrutura JSON:

{
    "a": {
        "attrib1": "value1",
        "attrib2": "value2"
    }
}
Predefinição Nenhum.
Presença Opcional
Tipo String

Elementos <OutputPrefix> e <OutputSuffix>

Use estes elementos em conjunto para aplicar um prefixo e/ou um sufixo ao JSON gerado.

<OutputPrefix>PREFIX_</OutputPrefix>
<OutputSuffix>_SUFFIX</OutputSuffix>

Considere o seguinte exemplo de XML:

<a>value</a>

Suponhamos que a configuração da política é a seguinte:

<XMLToJSON name='XMLToJSON-4'>
  <Options>
    <OutputPrefix>{ "result": </OutputPrefix>
    <OutputSuffix>}</OutputSuffix>
  </Options>
</XMLToJSON>

É gerada a seguinte estrutura JSON:

{
  "result": {
    "a": "value"
  }
}

Pode omitir OutputPrefix, OutputSuffix ou ambos.

A utilização destes elementos pode gerar JSON inválido. Por exemplo, usando esta configuração de política:

<XMLToJSON name='XMLToJSON-4'>
  <Options>
    <OutputPrefix>PREFIX_</OutputPrefix>
  </Options>
</XMLToJSON>

A política gera o seguinte, que não é um JSON válido:

PREFIX_{
  "a" : "value"
}

Se a configuração não especificar OutputPrefix nem OutputSuffix, a política gera a seguinte estrutura JSON:

{
  "a": "value"
}
Predefinição Veja exemplos acima.
Presença Opcional
Tipo String

Elemento <StripLevels>

<Options>
    <StripLevels>4</StripLevels>
</Options>

Por vezes, as cargas úteis XML, como SOAP, têm muitos níveis principais que não quer incluir no JSON convertido. Segue-se um exemplo de resposta SOAP que contém vários níveis:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/Schemata-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <soap:Body>
      <GetCityWeatherByZIPResponse xmlns="http://ws.cdyne.com/WeatherWS/">
          <GetCityWeatherByZIPResult>
              <State>CO</State>
              <City>Denver</City>
              <Description>Sunny</Description>
              <Temperature>62</Temperature>
          </GetCityWeatherByZIPResult>
      </GetCityWeatherByZIPResponse>
  </soap:Body>
</soap:Envelope>

Existem 4 níveis antes de chegar ao nível de estado, cidade, descrição e temperatura. Sem usar <StripLevels>, a resposta JSON convertida teria o seguinte aspeto:

{
   "Envelope" : {
      "Body" : {
         "GetCityWeatherByZIPResponse" : {
            "GetCityWeatherByZIPResult" : {
               "State" : "CO",
               "City" : "Denver",
               "Description" : "Sunny",
               "Temperature" : "62"
            }
         }
      }
   }
}

Se quiser remover esses 4 primeiros níveis na resposta JSON, deve definir <StripLevels>4</StripLevels>, o que lhe daria o seguinte JSON:

{
  "State" : "CO",
  "City" : "Denver",
  "Description" : "Sunny",
  "Temperature" : "62"
}

Pode remover níveis até ao primeiro elemento que contenha vários elementos secundários. O que é que isso significa? Vejamos um exemplo de JSON mais complexo:

{
   "Envelope" : {
      "Body" : {
         "GetCityForecastByZIPResponse" : {
            "GetCityForecastByZIPResult" : {
               "ResponseText" : "City Found",
               "ForecastResult" : {
                  "Forecast" : [
                     {
                        "ProbabilityOfPrecipiation" : {
                           "Nighttime" : "00",
                           "Daytime" : 10
                        }  ...

O nível 3 neste exemplo é GetCityForecastByZIPResponse, que tem apenas um filho. Assim, se usasse <StripLevels>3</StripLevels> (remover os primeiros três níveis), o JSON teria o seguinte aspeto:

{
   "GetCityForecastByZIPResult" : {
      "ResponseText" : "City Found",
      "ForecastResult" : {
         "Forecast" : [
            {
               "ProbabilityOfPrecipiation" : {
                  "Nighttime" : "00",
                  "Daytime" : 10
               }  ...

Repare que GetCityForecastByZIPResult tem vários filhos. Uma vez que é o primeiro elemento que contém vários filhos, pode remover este último nível através de <StripLevels>4</StripLevels>, o que lhe dá o seguinte JSON:

{
   "ResponseText" : "City Found",
   "ForecastResult" : {
      "Forecast" : [
         {
            "ProbabilityOfPrecipiation" : {
               "Nighttime" : "00",
               "Daytime" : 10
            }  ...

Uma vez que o nível 4 é o primeiro nível que contém vários elementos secundários, não pode remover nenhum nível inferior a este. Se definir o nível de remoção como 5, 6, 7 e assim sucessivamente, continua a receber a resposta acima.

Predefinição 0 (sem remoção de níveis)
Presença Opcional
Tipo Número inteiro

Elemento <TreatAsArray>/<Path>

<Options>
    <TreatAsArray>
        <Path unwrap="true">teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>

Esta combinação de elementos permite-lhe garantir que os valores de um documento XML são sempre traduzidos para uma matriz JSON. Isto pode ser útil quando o número de elementos secundários varia para diferentes payloads. O comportamento predefinido do Apigee é converter vários elementos secundários com o mesmo nome num array JSON e elementos secundários únicos numa primitiva JSON. A opção TreatAsArray permite-lhe garantir que os elementos secundários são sempre traduzidos para uma matriz JSON.

A utilização de TreatAsArray pode melhorar a estrutura do código subsequente que processa a saída, porque os dados da matriz são devolvidos sempre da mesma forma. Por exemplo, a avaliação de um JSONPath de $.teachers.teacher.studentnames.name[0] devolve o valor do primeiro nome de forma consistente, quer o XML original contenha um ou mais elementos name.

Vamos recuar um pouco e analisar o comportamento predefinido de XML para JSON e, em seguida, explorar como controlar o resultado através de <TreatAsArray>/<Path>.

Quando um documento XML contém um elemento com várias ocorrências (o que pode acontecer quando o esquema XML especifica maxOccurs='unbounded' para o elemento), a política de XML para JSON coloca automaticamente esses valores numa matriz. Por exemplo, o seguinte bloco XML

<teacher>
    <name>teacherA</name>
    <studentnames>
        <name>student1</name>
        <name>student2</name>
    </studentnames>
</teacher>

… é convertido automaticamente no seguinte JSON sem configuração de política especial:

{
  "teachers" : {
    "teacher" : {
      "name" : "teacherA",
      "studentnames" : {
        "name" : [
          "student1",
          "student2"
        ]
      }
    }
  }
}

Repare que os dois nomes dos alunos estão contidos numa matriz.

No entanto, se apenas um aluno aparecer no documento XML, a política de XML para JSON trata automaticamente o valor como uma única string e não como uma matriz de strings, conforme mostrado no exemplo seguinte:

{
  "teachers" : {
    "teacher" : {
      "name" : "teacherA",
      "studentnames" : {
        "name" : "student1"
      }
    }
  }
}

Nos exemplos anteriores, os dados semelhantes foram convertidos de forma diferente, uma vez numa matriz e outra numa única string. O elemento <TreatAsArray>/<Path> permite-lhe controlar o resultado para garantir que os nomes dos alunos são sempre convertidos num conjunto, mesmo que exista apenas um valor. Para configurar esta opção, identifique o caminho para o elemento cujos valores quer converter num conjunto, da seguinte forma:

<Options>
    <TreatAsArray>
        <Path>teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>

A configuração acima geraria o JSON da seguinte forma:

{
  "teachers" : {
    "teacher" : {
      "name" : "teacherA",
      "studentnames" : {
        "name" : ["student1"]
      }
    }
  }
}

Repare que student1 está agora num conjunto. Agora, independentemente de haver um ou vários alunos, pode obtê-los a partir de uma matriz JSON no seu código através do seguinte JSONPath: $.teachers.teacher.studentnames.name[0]

O elemento <Path> também tem um atributo unwrap, explicado na secção seguinte.

Predefinição N/A
Presença Opcional
Tipo String

Atributos

 <Options>
    <TreatAsArray>
        <Path unwrap="true">teachers/teacher/studentnames/name</Path>
    </TreatAsArray>
</Options>
Atributo Descrição Presença Tipo
anular união

Predefinição: false

Remove o elemento da saída JSON. Use esta opção para simplificar ou reduzir ("desembrulhar") o JSON, o que também reduz o JSONPath necessário para obter valores. Por exemplo, em vez de $.teachers.teacher.studentnames.name[*], pode reduzir o JSON e usar $.teachers.studentnames[*].

Segue-se um exemplo de JSON:

{
  "teachers" : {
      "teacher" : {
          "name" : "teacherA",
          "studentnames" : {
              "name" : [
                 "student1",
                 "student2"
              ]}...

Neste exemplo, pode argumentar que o elemento teacher e o elemento studentnames name são desnecessários. Assim, pode removê-los ou desembrulhá-los. Veja como configurar o elemento <Path> para o fazer:

<TreatAsArray>
    <Path unwrap="true">teachers/teacher</Path>
    <Path unwrap="true">teachers/teacher/studentnames/name</Path>
</TreatAsArray>

O atributo unwrap está definido como verdadeiro e são fornecidos os caminhos para os elementos a desembrulhar. O resultado JSON vai ter o seguinte aspeto:

{
  "teachers" : [{
      "name" : "teacherA",
      "studentnames" : ["student1","student2"]
      }]...

Tenha em atenção que, uma vez que o elemento <Path> está no elemento <TreatAsArray>, ambos os elementos no caminho são tratados como matrizes na saída JSON.

Opcional Booleano

Para mais exemplos e uma explicação passo a passo da funcionalidade, consulte este artigo da comunidade do Google Cloud.

<Format>

O formato dá-lhe controlo sobre a conversão de XML para JSON. Introduza o nome de um modelo predefinido que contenha uma combinação específica de elementos Options descritos neste tópico. Os formatos predefinidos incluem: xml.com, yahoo, google, badgerFish.

Use o elemento <Format> ou o grupo <Options>. Não pode usar <Format> e <Options> ao mesmo tempo.

Seguem-se as definições de formato de cada modelo predefinido.

xml.com

<RecognizeNull>true</RecognizeNull>
<TextNodeName>#text</TextNodeName>
<AttributePrefix>@</AttributePrefix>

yahoo

<RecognizeNumber>true</RecognizeNumber>
<TextNodeName>content</TextNodeName>

google

<TextNodeName>$t</TextNodeName>
<NamespaceSeparator>$</NamespaceSeparator>
<TextAlwaysAsProperty>true</TextAlwaysAsProperty>

badgerFish

<TextNodeName>$</TextNodeName>
<TextAlwaysAsProperty>true</TextAlwaysAsProperty>
<AttributePrefix>@</AttributePrefix>
<NamespaceSeparator>:</NamespaceSeparator>
<NamespaceBlockName>@xmlns</NamespaceBlockName>
<DefaultNamespaceNodeName>$</DefaultNamespaceNodeName>

Sintaxe do elemento:

<Format>yahoo</Format>
Predefinição (nenhum)
Valores válidos Uma das seguintes opções:
xml.com, yahoo, google, badgerFish
Presença Opcional, mas obrigatório se não usar <Options>.
Tipo String

Esquemas


Referência de erro

Esta secção descreve os códigos de falha e as mensagens de erro devolvidas, bem como as variáveis de falha definidas pelo Apigee quando esta política aciona um erro. Estas informações são importantes para saber se está a desenvolver regras de falhas para tratar falhas. Para saber mais, consulte o artigo O que precisa de saber acerca dos erros de políticas e o artigo Processamento de falhas.

Erros de tempo de execução

Estes erros podem ocorrer quando a política é executada.

Código de falha Estado de HTTP Causa Corrigir
steps.xmltojson.ExecutionFailed ExecutionFailed Este erro ocorre quando a carga útil de entrada (XML) está vazia ou o XML de entrada é inválido ou tem um formato incorreto.
steps.xmltojson.InCompatibleTypes ExecutionFailed Este erro ocorre se o tipo da variável definida no elemento <Source> e no elemento <OutputVariable> não for o mesmo. É obrigatório que o tipo das variáveis contidas no elemento <Source> e no elemento <OutputVariable> corresponda.
steps.xmltojson.InvalidSourceType ExecutionFailed Este erro ocorre se o tipo da variável usada para definir o elemento <Source> for inválido.Os tipos de variáveis válidos são message e string.
steps.xmltojson.OutputVariableIsNotAvailable ExecutionFailed Este erro ocorre se a variável especificada no elemento <Source> do XML para a política JSON for do tipo string e o elemento <OutputVariable> não estiver definido. O elemento <OutputVariable> é obrigatório quando a variável definida no elemento <Source> é do tipo string.
steps.xmltojson.SourceUnavailable ExecutionFailed Este erro ocorre se a variável message especificada no elemento <Source> da política de XML para JSON for:
  • Fora do âmbito (não disponível no fluxo específico onde a política está a ser executada) ou
  • Não é possível resolver (não está definido)

Erros de implementação

Estes erros podem ocorrer quando implementa um proxy que contém esta política.

Nome do erro Causa Corrigir
EitherOptionOrFormat Se um dos elementos <Options> ou <Format> não for declarado no XML para a política JSON, a implementação do proxy de API falha.
UnknownFormat Se o elemento <Format> na política de XML para JSON tiver um formato desconhecido definido, a implementação do proxy de API falha. Os formatos predefinidos incluem: xml.com, yahoo, google e badgerFish.

Variáveis de falha

Estas variáveis são definidas quando ocorre um erro de tempo de execução. Para mais informações, consulte o artigo O que precisa de saber acerca dos erros de políticas.

Variáveis Onde Exemplo
fault.name="fault_name" fault_name é o nome da falha, conforme indicado na tabela Erros de tempo de execução acima. O nome da falha é a última parte do código de falha. fault.name = "SourceUnavailable"
xmltojson.policy_name.failed policy_name é o nome especificado pelo utilizador da política que gerou a falha. xmltojson.XMLtoJSON-1.failed = true

Exemplo de resposta de erro

{
  "fault": {
    "faultstring": "XMLToJSON[XMLtoJSON-1]: Source xyz is not available",
    "detail": {
      "errorcode": "steps.xml2json.SourceUnavailable"
    }
  }
}

Exemplo de regra de falha

<faultrule name="VariableOfNonMsgType"></faultrule><FaultRule name="XML to JSON Faults">
    <Step>
        <Name>AM-SourceUnavailableMessage</Name>
        <Condition>(fault.name Matches "SourceUnavailable") </Condition>
    </Step>
    <Step>
        <Name>AM-BadXML</Name>
        <Condition>(fault.name = "ExecutionFailed")</Condition>
    </Step>
    <Condition>(xmltojson.XMLtoJSON-1.failed = true) </Condition>
</FaultRule>

Tópicos relacionados

JSON para XML: política JSONtoXML