¡Caminando hacia el éxito!

Aprende en Comunidad

Avalados por :

Cómo convertir datos JSON a XML en SAP PI/PO: código y error de mapeo resueltos

  • Creado 01/03/2024
  • Modificado 01/03/2024
  • 29 Vistas
0
Cargando...

Estimados Expertos,

Estoy tratando de convertir datos JSON a XML con el siguiente código que fue compartido por Hareesh. Funciona bien cuando se prueba en la pestaña de Prueba de Mapeo de Operación ESR. Pero cuando se ejecuta el mismo payload durante el tiempo de ejecución, muestra un error.

Código

package com.sap.json;

import java.io.BufferedReader;

import java.io.InputStream;

import java.io.InputStreamReader;

import org.json.JSONObject;

import com.sap.aii.mapping.api.AbstractTransformation;

import com.sap.aii.mapping.api.StreamTransformationException;

import com.sap.aii.mapping.api.TransformationInput;

import com.sap.aii.mapping.api.TransformationOutput;

public class ConvJsonXml extends AbstractTransformation {

public void transform(TransformationInput in, TransformationOutput out) throws StreamTransformationException {

try {

String sourcexml = ""; String targetxml =""; String line ="";

InputStream ins = in.getInputPayload().getInputStream();

BufferedReader br = new BufferedReader( new InputStreamReader(ins));

while ((line = br.readLine()) != null)

sourcexml +=line+"\n";

br.close();

JSONObject o = new JSONObject(sourcexml);

targetxml = org.json.XML.toString(o);

targetxml = "<root>"+targetxml+"</root>";

out.getOutputPayload().getOutputStream().write(targetxml.getBytes());

}

catch (Exception e) {

throw new StreamTransformationException(e.getMessage());

}

}

}

Carga

{

"items": [

{

"item": {

"Subject": "prueba por DS Ross",

"DocumentID": "55DCE0A476D",

"Sender": "Rebecca",

"SenderName": "usuario1",

"Date": "2013-02-14 11:14:40",

"ClassID": "11"

}

},

{

"item": {

"Subject": "prueba por Nick M",

"DocumentID": "55DCE191D5E47",

"Sender": "Dave Froster",

"SenderName": "usuario11",

"Date": "2013-03-14 11:14:40",

"ClassID": "11"

}

}

]

}

Cuando se prueba en la pestaña de Prueba de Mapeo de Operación, no muestra errores. Pero cuando el mismo payload se recibe del servidor, muestra el error de mapeo

<SAP:Stack> com.sap.engine.interfaces.messaging.api.exception.MessagingException: com.sap.engine.interfaces.messaging.api.exception.MessagingException: Error encontrado al ejecutar el mapeo: com.sap.aii.af.service.mapping.MappingException: El programa de mapeo de aplicación com/sap/json/ConvJsonXml lanza una excepción de transformación de flujo: Un texto JSONObject debe comenzar con '{' en 1 [carácter 2 línea 1] en com.sap.aii.adapter.soap.web.SOAPHandler.processSOAPtoXMB(SOAPHandler.java:746) en com.sap.aii.adapter.soap.web.MessageServlet.doPost(MessageServlet.java:505) en javax.servlet.http.HttpServlet.service(HttpServlet.java:754) en javax.servlet.http.HttpServlet.service(HttpServlet.java:847) en com.sap.engine.services.servlets_jsp.server.runtime.FilterChainImpl.runServlet(FilterChainImpl.java:202) en

Agradecería la ayuda compartida..

Saludos......

Pedro Pascal
Se unió el 07/03/2018
Pinterest
Telegram
Linkedin
Whatsapp

4 Respuestas

0
Cargando...

Me encontré con este problema también y a continuación se muestra la solución (en caso de que alguien pueda encontrarse con ello):

char a = '{';
char b = '}';

sourcexml = sourcexml.substring(sourcexml.indexOf(a), sourcexml.lastIndexOf(b) + 1);

JSONObject o = new JSONObject(sourcexml);

Justo antes de la instancia JSONObject, agregar esa declaración. Esta declaración buscará el primer índice de '{' y el último índice de '}' y mantendrá la subcadena. Agregar 1 es necesario para mantener la llave de cierre.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Rebecca,

¿Qué quieres decir con "no está funcionando"? ¿El System.out.println((int)sourcexml.charAt(0)); devuelve 123?

Si no es así, el problema puede ser la recepción de la carga útil porque sourcexml debe comenzar con una llave.

Por favor, dinos qué "int" obtienes.

Saludos,
Pierre.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Pierre,

Gracias..

Sí, estoy utilizando la misma carga útil que recibí después de ejecutarla desde SOAP UI al disparar la URL. Funciona en la asignación de operaciones pero falla cuando la inicio desde ABAP Proxy hacia el servicio JSON.

Intenté lo sugerido arriba y no funcionó...

Saludos...

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019
0
Cargando...

Hola Rebecca,

¿Estás segura de recibir el mismo payload exacto que describiste arriba desde el servidor?

Puedes intentar:

System.out.println((int)sourcexml.charAt(0));

Lo cual debería devolver 123. 123 significa que comienza con llave de apertura.

Este hilo en stackoverflow.com también puede ayudarte:

http://stackoverflow.com/questions/19586199/aws-json-exception-a-jsonobject-text-must-begin-with-at-...

Saludos,

Pierre.

Respondido el 15/04/2024
LUCIANO RIOJA GHIOTTO
Se unió el 13/07/2019

contacto@primeinstitute.com

(+51) 1641 9379
(+57) 1489 6964

© 2024 Copyright. Todos los derechos reservados.

Desarrollado por Prime Institute

¡Hola! Soy Diana, asesora académica de Prime Institute, indícame en que curso estas interesado, saludos!
Hola ¿Puedo ayudarte?