es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Pasando un JSON_OBJECT_T a SODA_DOCUMENT_T

Tengo un gestor PL/SQL que utiliza el paquete SODA para manipular una base de datos JSON. Quiero:

  1. Leer el valor de la clave id en la carga útil.
  2. Escribir el JSON de la carga útil en un nuevo documento en la base de datos.

Para hacer el paso 1, el gestor toma :body para que se analice como un tipo JSONOBJECT, de manera que pueda acceder al valor de la clave id en la carga útil.

Pero para el paso 2, si vuelvo a leer body al construirlo con SODA_DOCUMENT_T(b_content=> :body), simplemente me dará un documento en blanco.

Tampoco puedo pasar la variable JSONOBJECTT directamente, como SODA_DOCUMENT_T(j_content=> jso), porque esa función espera un tipo JSON y no un JSONOBJECTT. No puedo encontrar la documentación del tipo JSON, pero vi en ejemplos de código la función JSON('{}') para generar uno.

Sin embargo, leer :body_text me causa otros problemas, porque la función JSON() no puede manejar saltos de línea en la carga útil y en su lugar muestra un error.

Actualmente para solucionarlo estoy utilizando lo siguiente:

SODA_DOCUMENT_T(
j_content => JSON(jso.to_string())
)

Lo cual parece muy absurdo porque lo serialize a una cadena de nuevo antes de convertirlo nuevamente en un tipo JSON. ¿Hay alguna manera adecuada de leer el valor de una clave en la carga útil y pasarlo a SODADOCUMENTT?

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Para leer el valor de la clave id en la carga útil y pasarlo a SODA_DOCUMENT_T, puedes utilizar el método JSON_OBJECT_T.get_string para extraer el valor como una cadena y luego usarlo para construir un nuevo objeto JSON. Aquí tienes un ejemplo de implementación:

    DECLARE
      -- suponiendo que :body es una carga útil JSON que contiene la clave "id"
      j_payload JSON_OBJECT_T := JSON_OBJECT_T(:body);
    
      -- extraer el valor de la clave "id" como una cadena
      id_str VARCHAR2(50) := j_payload.get_string('id');
    
      -- construir un nuevo objeto JSON que contenga la carga útil original
      j_content JSON := JSON(j_payload.to_string());
    
      -- crear un nuevo documento SODA con el id extraído y la carga útil original como contenido
      doc SODA_DOCUMENT_T := SODA_DOCUMENT_T(
        b_content => j_content,
        key => id_str
      );
    BEGIN
      -- insertar el nuevo documento en la base de datos
      ... 
    END;
    

    Ten en cuenta que si el valor de la clave id no es una cadena, es posible que debas utilizar un método diferente para extraerlo y convertirlo al tipo correcto. Además, asegúrate de manejar correctamente las excepciones y los errores que puedan ocurrir durante el análisis, la extracción y la inserción.

Comments are closed.