Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Manipulación OBJETOS JSON

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Manipulación OBJETOS JSON Responder citando

No encuentro la forma de modificar los elemento del contenido de fichero JSON, ni elementos simples ni compuestos.
Puedo CREAR elementos con ->AddPair pero esta forma que me propone ChatGPT no funciona porque su propiedad es de LECTURA y no de ESCRITURA.

Pondo codigo de la funciones que tengo con la ayuda de ChatGTP:

void CrearArchivoJSON(const String& archivo);
void LeerArchivoJSON(const String& archivo);
void LeerArrayJSON(const String& archivo);

Esta función no consigo que funcione:
void ModificarArchivoJSON(const String& archivo);

Código:

void __fastcall TForm1::CrearArchivoJSON(const String& archivo)
{
try
   {
      // Crear el objeto raíz
      TJSONObject* jsonObj = new TJSONObject();

      // Añadir un par clave-valor simple
      jsonObj->AddPair("nombre", "Ejemplo");

      // Crear un objeto anidado (detalles)
      TJSONObject* detalles = new TJSONObject();
      detalles->AddPair("edad", 58);
      detalles->AddPair("ocupacion", "Desarrollador");

      // Crear un array de habilidades
      TJSONArray* habilidades = new TJSONArray();
      habilidades->Add(new TJSONString("C++"));
      habilidades->Add(new TJSONString("Java"));
      habilidades->Add(new TJSONString("Python"));

      // Añadir el array al objeto "detalles"
      detalles->AddPair("habilidades", habilidades);

      // Añadir el objeto "detalles" al objeto raíz
      jsonObj->AddPair("detalles", detalles);

      // Crear un array de proyectos
      TJSONArray* proyectos = new TJSONArray();

      // Proyecto A
      TJSONObject* proyectoA = new TJSONObject();
      proyectoA->AddPair("nombre", "Proyecto A");
      proyectoA->AddPair("completado", true);
      proyectos->Add(proyectoA);

      // Proyecto B
      TJSONObject* proyectoB = new TJSONObject();
      proyectoB->AddPair("nombre", "Proyecto B");
      proyectoB->AddPair("completado", false);
      proyectos->Add(proyectoB);

      // Añadir el array de proyectos al objeto raíz
      jsonObj->AddPair("proyectos", proyectos);

      // Guardar el JSON en un archivo
      TStringList* archivoContenido = new TStringList();
      archivoContenido->Text = jsonObj->ToString();
      archivoContenido->SaveToFile(archivo);

      // Liberar memoria
      delete archivoContenido;
      delete jsonObj;

      ShowMessage("Archivo JSON complejo creado exitosamente.");
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al crear el archivo JSON: " + e.Message);
   }
}
//---------------------------------------------------------------------------


Código:

void __fastcall TForm1::LeerArchivoJSON(const String& archivo)
{
   try
   {
      // Leer el archivo en un TStringList
      TStringList* archivoContenido = new TStringList();
      archivoContenido->LoadFromFile(archivo);

      // Parsear el contenido a un objeto JSON
      TJSONObject* jsonObj = (TJSONObject*)TJSONObject::ParseJSONValue(archivoContenido->Text);

      // Mostrar un valor específico (si existe la clave)
      if (jsonObj != nullptr && jsonObj->GetValue("clave"))
      {
         String valor = jsonObj->GetValue("clave")->Value();
         ShowMessage("Valor de 'clave': " + valor);
      }

      // Liberar memoria
      delete archivoContenido;
      delete jsonObj;
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al leer el archivo JSON: " + e.Message);
   }
}
//---------------------------------------------------------------------------


Código:

void __fastcall TForm1::LeerArrayJSON(const String& archivo)
{
   try
   {
      TStringList* archivoContenido = new TStringList();
      archivoContenido->LoadFromFile(archivo);
      TJSONObject* jsonObj = (TJSONObject*)TJSONObject::ParseJSONValue(archivoContenido->Text);

      if (jsonObj != nullptr && jsonObj->GetValue("proyectos"))
      {
         TJSONArray* jsonArray = (TJSONArray*)jsonObj->GetValue("proyectos");
         for (int i = 0; i <jsonArray>Count; i++)
         {
            TJSONValue* valor = jsonArray->Items[i];
            ShowMessage("Elemento " + IntToStr(i) + ": " + valor->ToString());
         }
      }

      delete archivoContenido;
      delete jsonObj;
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al leer el array JSON: " + e.Message);
   }
}
//---------------------------------------------------------------------------


Código:

void __fastcall TForm1::ModificarArchivoJSON(const String& archivo)
{
   try
   {
      // Leer el archivo JSON
      TStringList* archivoContenido = new TStringList();
      archivoContenido->LoadFromFile(archivo);

      // Parsear el contenido JSON
      TJSONObject* jsonObj = (TJSONObject*)TJSONObject::ParseJSONValue(archivoContenido->Text);

      if (jsonObj != nullptr)
      {
         // Modificar valores en el JSON
         if (jsonObj->GetValue("nombre"))
         {
//            jsonObj->GetValue("nombre")->Value() = "Proyecto B";//NO FUNCIONA

            //ALTERNATIVA que propone ChatGTP,
            //pero no es apropiada porque el nuevo elemento se pone al final del fichero
            jsonObj->RemovePair("nombre");//FUNCIONA
            jsonObj->AddPair("nombre", "Proyecto B");
         }

         // Modificar valores en un objeto anidado
         if (jsonObj->GetValue("detalles"))
         {
            TJSONObject* detalles = (TJSONObject*)jsonObj->GetValue("detalles");
            if (detalles->GetValue("edad"))
            {
               detalles->GetValue("edad")->Value() = 35; // Cambiar la edad
            }
         }

         // Modificar valores dentro de un array
         if (jsonObj->GetValue("proyectos"))
         {
            TJSONArray* proyectos = (TJSONArray*)jsonObj->GetValue("proyectos");

            // Modificar el primer proyecto
            if (proyectos->Count > 0)
            {
               TJSONObject* proyecto = (TJSONObject*)proyectos->Items[0];
               if (proyecto->GetValue("nombre"))
               {
                  proyecto->GetValue("nombre")->Value() = "Proyecto Modificado";
               }
               if (proyecto->GetValue("completado"))
               {
                  proyecto->GetValue("completado")->Value() = false; // Cambiar a no completado
               }
            }
         }

         // Guardar los cambios al archivo
         archivoContenido->Text = jsonObj->ToString();
         archivoContenido->SaveToFile(archivo);

         ShowMessage("Archivo JSON modificado exitosamente.");
      }
      else
      {
         ShowMessage("El archivo JSON no pudo ser parseado.");
      }

      // Liberar memoria
      delete archivoContenido;
      delete jsonObj;
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al modificar el archivo JSON: " + e.Message);
   }
}
//---------------------------------------------------------------------------

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Al parecer no permite modificar, no me había fijado en este detalle ya que hasta ahora solo lo había usado para leer algún archivo sin necesidad de modificarlo. Revisando las cabeceras, todas las propiedades relacionadas con valores son de solo lectura, y la única posibilidad que veo es la que te sugiere ChatGPT aunque modifica el orden..

Si no usas una versión vieja de C++Builder hay una "librería" sencilla bastante popular que está muy bien y te da la opción al editar de mantener el orden del json original:

https://github.com/nlohmann/json

Pongo lo de librería entre comillas porque es tan simple de usar como añadir una cabecera (json.hpp) y nada más:

https://github.com/nlohmann/json/releases/download/v3.11.3/json.hpp

Pongo como ejemplo algo similar a lo que haces en el código que has puesto, pero usando "json.hpp":

Código:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#include <fstream>
#include "json.hpp"                    // https://github.com/nlohmann/json
//using json = nlohmann::json;         // Cambia el orden
using json = nlohmann::ordered_json;   // Mantiene el orden del json original
                                       // Doc: https://json.nlohmann.me/
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1* Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::CrearArchivoJSON(const String& archivo)
{
    try
    {
        // Crear el JSON con el orden que quieres
        json j = {
            {"nombre", "Ejemplo"},
            {"detalles", {
                {"edad", 58},
                {"ocupacion", "Desarrollador"},
                {"habilidades", {true, true, true}}
            }},
            {"proyectos", {
                {
                    {"nombre", "Proyecto A"},
                    {"completado", true}
                },
                {
                    {"nombre", "Proyecto B"},
                    {"completado", false}
                }
            }}
        };

          /***Otra forma alternativa de crear lo mismo que arriba:
          json j;
            // Añadir valores simples
          j["nombre"] = "Ejemplo";
            // Añadir un objeto anidado
          j["detalles"]["edad"] = 58;
          j["detalles"]["ocupacion"] = "Desarrollador";
          j["detalles"]["habilidades"] = {true, true, true};
            // Crear un array de proyectos
          auto& proyectos = j["proyectos"];
          proyectos.push_back({{"nombre","Proyecto A"}, {"completado",true}});
          proyectos.push_back({{"nombre","Proyecto B"}, {"completado",false}});
          ***/

        // Guardar en archivo con indentación
        std::ofstream archivoSalida(archivo.c_str());
        archivoSalida << j.dump(4);

        ShowMessage("Archivo JSON creado OK");
    }
    catch (const std::exception& e)
    {
        ShowMessage(e.what());
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LeerArchivoJSON(const String& archivo)
{
    try
    {
        // Leer el archivo JSON
        std::ifstream archivoEntrada(archivo.c_str());
        json j;
        archivoEntrada >> j;

        // Mostrar un valor específico (si existe)
        if (j.contains("nombre")) {
            std::string valor = j["nombre"];
            ShowMessage("Valor de 'nombre': " + String(valor.c_str()));
        }
    }
    catch (const std::exception& e)
    {
        ShowMessage(e.what());
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::LeerArrayJSON(const String& archivo)
{
    try
    {
        // Leer el archivo JSON
        std::ifstream archivoEntrada(archivo.c_str());
        json j;
        archivoEntrada >> j;

        if (j.contains("proyectos") && j["proyectos"].is_array())
        {
            size_t num_proyectos = j["proyectos"].size();
            String str;
            for (int i = 0; i < num_proyectos; i++)
            {
                const auto& proyecto = j["proyectos"][i];
                std::string nombre = proyecto["nombre"];
                bool completado = proyecto["completado"];
                str += IntToStr(i) + " - Nombre: " + String(nombre.c_str())
                    + ", Completado: " + String(completado?"Si":"No") + "\n";
            }
            ShowMessage(str);
        }
    }
    catch (const std::exception& e)
    {
        ShowMessage(e.what());
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ModificarArchivoJSON(const String& archivo)
{
    try
    {
        // Leer el archivo JSON manteniendo el orden original
        std::ifstream archivoEntrada(archivo.c_str());
        json j;
        archivoEntrada >> j;

        // Modificar el valor "nombre"
        if (j.contains("nombre")) {
            j["nombre"] = "Nuevo Nombre";
        }

        // Guardar de vuelta al archivo
        std::ofstream archivoSalida(archivo.c_str());
        archivoSalida << j.dump(4);

        ShowMessage("Archivo JSON modificado OK");
    }
    catch (const std::exception& e)
    {
        ShowMessage(e.what());
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnCrearClick(TObject *Sender)
{
    CrearArchivoJSON("prueba.json");
}
//---------------------------------------------------------------------------

void __fastcall TForm1::btnLeerClick(TObject *Sender)
{
    LeerArchivoJSON("prueba.json");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnLeerArrayClick(TObject *Sender)
{
    LeerArrayJSON("prueba.json");
}
//---------------------------------------------------------------------------
void __fastcall TForm1::btnModificarClick(TObject *Sender)
{
    ModificarArchivoJSON("prueba.json");
}
//---------------------------------------------------------------------------


Avísame en caso de que uses una versión vieja que no lleve el compilador de C++ moderno (clang) e intento buscar otra opción..
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias...
Estuve trasteando también en github.com...
https://github.com/joaquinrmi/JSON
(No sé si es la misma LIBRERIA)

Utilizo STUDIO 12.2 y utilizo el compilador antiguo no el (clang)))

Cita:

#include "JSON.hpp"
using JSON = dnc::JSON;// Esto es así porque en el fichero JSON.hpp está un MAMESPACE -> namespace dnc


Código:

void __fastcall TForm1::Button3Click(TObject *Sender)
{
//   ModificarArchivoJSON("D:\\Prueba_3.JSON");
   //JSON.hpp
   //creando un objeto vacío, igual a 'null'
   JSON empty;

   //creando un objeto de valor booleano
   JSON bool_object = true;

   //creando un objeto de valor numérico
   JSON number = 3.14159265359;

   //creando una cadena de texto
   JSON str = "Hello World!";

   //creando un arreglo vacío
   JSON arr = JSON::Array();

   //creando un objeto vacío
   JSON obj = JSON::Object();

   //creando un arreglo no vacío
   JSON arr2 = JSON::Array({
      true, 25, false, "mouse"
   });

   //creando un objeto no vacío
   JSON obj2({
      {"empty", JSON()},
      {"age", 3.14159265359},
      {"name", "Juan"},
      {"friends", JSON::Array({
        "Pepe", "Claudia", "Teresa"
      })}
   });

   obj2.saveToFile("D:\\Prueba_5.JSON");
}
//---------------------------------------------------------------------------


Pero tampoco encontré la forma de manipular sus elementos sin modificar estructura de JSON...

GRACIAS LEO...
Al final he pensado que si las librerías actuales no ponen énfasis en la modificación de los ELEMENTOS de JSON será porque es muy poco probable que se vaya a usar. SOLO QUE YO PENSÉ... si puedo crear y borrar ELEMENTOS voy a implementar la MODIFICACIÓN por si en un futuro se me plantea de la situación de necesidad. Visto que tú mismo no te habías percatado de ello según tus palabras, parece ser que la modificación de los elementos no tiene mucho argumento en un entorno real...
No obstante, tomo nota de ello y aprendo del código que me has escrito.

Por otro lado, que tal si hablamos de TELETRABAJO y me ayudas a desarrollar TICKETBAI Y VERIFACTU... Te pagaría por adelantado lo que tu me digas... INSISTO en el tema porque es CRUCIAL PARA MI ya que si no lo consigo desarrollar toda mi EMPRESA SE VA AL TRASTE.
Bueno no quiero agobiarte, ya me dirás...
_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mensaje    Asunto: Responder citando

Probaste la librería que puse arriba? precisamente lo que mire es que si conserva la estructura y orden del json original. Es una de las librerías más populares que hay en C++.

Tal como esta en el ejemplo que puse conserva la estructura y orden, pero también te da la opción de no conservarla y ordenarla a su manera que creo que lo hace alfabéticamente.

La que has puesto se parece, pero no es la misma en principio, no esta marcada como un fork de la anterior que el enlace que puse es el autor original, ni menciona si lo ha copiado.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Todo lo mencionado antes lo estaba haciendo en un proyecto nuevo, no en el que utilizo para mi UNICO Y GRAN PROYECTO.
Cuando intenté compilar marcando la opción de proyecto:
C++ Compilers (WIN32)
Use 'classic' Borland compiler = false

Entonces me daba cientos de errores en la compilación, todo debido a la librería JSON.hpp. No con el ejemplo que tu me pusiste. Pero en tu respuesta ya vi que mencionabas si compilaba con classic Borlan compiler o con el moderno (clang)...

En mi proyecto único y grande no puedo compilar con clang porque utilizo rutinas antiguas que no soportan dicho compilador...

Imagino que con la LIBRERIA que me has propuesto también me daría errores de compilación ya que lo mencionas pero puedo estar equivocado.

Al final utilizaré estos componentes que trae por defecto el Studio 12.2:
TJSONObject + RESTClient + RESTRequest + RESTResponse

#include System.JSON.hpp
#include REST.Client.hpp
#include REST.Types.hpp
#include memory
#include System.NetEncoding.hpp // Para codificación Base64

Me es suficiente para enviar peticiones JSON y recibir sus respuestas y gestionar las respuestas con TJSONObject...

De este modo puedo compilar con el classic Borland compiler...

Ahora bien... si conoces otra forma de modificar fichero JSON pero que compile con el compilador classic Borlan compiler... pues como siempre sería bien venido.

Te pongo código que estoy utilizando para que mi programa TPVBarman pueda tener PASARELA DE PAGO a DATAFONOS DE PAYTEF que es lo que estaba desarrollando y necesitaba CREAR Y LEER JSON.

Código:

void __fastcall TForm1::Venta(void)
{
   try {
      // Configurar el cliente REST
      RESTClient1->BaseURL = "http://192.168.1.138:8887/transaction/start"; // Endpoint base
      RESTRequest1->Method = rmPOST; // Método HTTP

      // Crear el cuerpo de la solicitud (JSON)
      std::unique_ptr<TJSONObject> requestBody(new TJSONObject());
      requestBody->AddPair("pinpad", "*");
      requestBody->AddPair("opType", "sale");
      requestBody->AddPair("cardNumberHashDomain", "branch");
      requestBody->AddPair("createReceipt", false);
      requestBody->AddPair("languaje", "es");
      requestBody->AddPair("requestedAmount", 1431);
      requestBody->AddPair("requiereConfirmation", false);
      requestBody->AddPair("transactionReference", "TPVBarman TICKET.N: 112356");

      // Agregar el objeto anidado al objeto principal
      TJSONObject *executeOptions = new TJSONObject();
      executeOptions->AddPair("method", "polling");
      requestBody->AddPair("executeOptions", executeOptions);

      // Asignar el cuerpo al RESTRequest
      RESTRequest1->ClearBody();
      RESTRequest1->AddBody(requestBody->ToString(), ctAPPLICATION_JSON);

      // Enviar solicitud
      RESTRequest1->Execute();

      if (RESTResponse1->StatusCode == 200)
      {
         //   Memo1->Text = RESTResponse1->Content;
         ShowMessage("Transacción exitosa");
      }
      else
         {
            //Memo1->Text = RESTResponse1->Content;
            ShowMessage("Error en la transacción: Código " + IntToStr(RESTResponse1->StatusCode));
         }

//      delete executeOptions;
   }
   catch (const Exception &e)
      {
         ShowMessage("Error: " + e.Message);
       }
}



Código:

void __fastcall TForm1::Vevolucion(void)
{
   try {
      // Configurar el cliente REST
      RESTClient1->BaseURL = "http://192.168.1.138:8887/transaction/start"; // Endpoint base
      RESTRequest1->Method = rmPOST; // Método HTTP

      // Crear el cuerpo de la solicitud (JSON)
      std::unique_ptr<TJSONObject> requestBody(new TJSONObject());
      requestBody->AddPair("pinpad", "*");
      requestBody->AddPair("opType", "refund");
      requestBody->AddPair("cardNumberHashDomain", "branch");
      requestBody->AddPair("createReceipt", false);
      requestBody->AddPair("languaje", "es");
      requestBody->AddPair("requestedAmount", 1431);
      requestBody->AddPair("requiereConfirmation", false);
      requestBody->AddPair("transactionReference", "TPVBarman TICKET.N: 112356");

      // Agregar el objeto anidado al objeto principal
      TJSONObject *executeOptions = new TJSONObject();
      executeOptions->AddPair("method", "polling");
      requestBody->AddPair("executeOptions", executeOptions);

      // Asignar el cuerpo al RESTRequest
      RESTRequest1->ClearBody();
      RESTRequest1->AddBody(requestBody->ToString(), ctAPPLICATION_JSON);

      // Enviar solicitud
      RESTRequest1->Execute();

      if (RESTResponse1->StatusCode == 200)
      {
         ShowMessage("Transacción exitosa");
      }
      else
         {
            ShowMessage("Error en la transacción: Código " + IntToStr(RESTResponse1->StatusCode));
         }

      delete executeOptions;
   }
   catch (const Exception &e)
      {

         ShowMessage("Error: " + e.Message);
      }
}


Código:

void __fastcall TForm1::Preautorizacion(void)
{
   try {
      // Configurar el cliente REST
      RESTClient1->BaseURL = "http://192.168.1.138:8887/transaction/start"; // Endpoint base
      RESTRequest1->Method = rmPOST; // Método HTTP

      // Crear el cuerpo de la solicitud (JSON)
      std::unique_ptr<TJSONObject> requestBody(new TJSONObject());
      requestBody->AddPair("pinpad", "*");
      requestBody->AddPair("opType", "auth");
      requestBody->AddPair("cardNumberHashDomain", "branch");
      requestBody->AddPair("createReceipt", false);
      requestBody->AddPair("languaje", "es");
      requestBody->AddPair("requestedAmount", 1431);
      requestBody->AddPair("requiereConfirmation", false);
      requestBody->AddPair("transactionReference", "TPVBarman TICKET.N: 112356");

      // Agregar el objeto anidado al objeto principal
      TJSONObject *executeOptions = new TJSONObject();
      executeOptions->AddPair("method", "polling");
      requestBody->AddPair("executeOptions", executeOptions);

      // Asignar el cuerpo al RESTRequest
      RESTRequest1->ClearBody();
      RESTRequest1->AddBody(requestBody->ToString(), ctAPPLICATION_JSON);

      // Enviar solicitud
      RESTRequest1->Execute();

      if (RESTResponse1->StatusCode == 200)
      {
         //   Memo1->Text = RESTResponse1->Content;
         ShowMessage("Transacción exitosa");
      }
      else
         {
            //Memo1->Text = RESTResponse1->Content;
            ShowMessage("Error en la transacción: Código " + IntToStr(RESTResponse1->StatusCode));
         }

      delete executeOptions;
   }
   catch (const Exception &e)
      {
         ShowMessage("Error: " + e.Message);
      }
}


Código:

void __fastcall TForm1::CierrePreautorizacion(void)
{
   try {
      // Configurar el cliente REST
      RESTClient1->BaseURL = "http://192.168.1.138:8887/transaction/start"; // Endpoint base
      RESTRequest1->Method = rmPOST; // Método HTTP

      // Crear el cuerpo de la solicitud (JSON)
      std::unique_ptr<TJSONObject> requestBody(new TJSONObject());
      requestBody->AddPair("pinpad", "*");
      requestBody->AddPair("opType", "authClose");
      requestBody->AddPair("cardNumberHashDomain", "branch");
      requestBody->AddPair("createReceipt", false);
      requestBody->AddPair("languaje", "es");
      requestBody->AddPair("requestedAmount", 1431);
      requestBody->AddPair("requiereConfirmation", false);
      requestBody->AddPair("transactionReference", "TPVBarman TICKET.N: 112356");

      // Agregar el objeto anidado al objeto principal
      TJSONObject *executeOptions = new TJSONObject();
      executeOptions->AddPair("method", "polling");
      requestBody->AddPair("executeOptions", executeOptions);

      // Agregar el objeto anidado al objeto principal
      TJSONObject *operationDetils = new TJSONObject();
      executeOptions->AddPair("previousOperationNumber", 298939856);
      requestBody->AddPair("operationDetils", operationDetils);

      // Asignar el cuerpo al RESTRequest
      RESTRequest1->ClearBody();
      RESTRequest1->AddBody(requestBody->ToString(), ctAPPLICATION_JSON);

      // Enviar solicitud
      RESTRequest1->Execute();

      if (RESTResponse1->StatusCode == 200)
      {
         ShowMessage("Transacción exitosa");
      }
      else
         {
            ShowMessage("Error en la transacción: Código " + IntToStr(RESTResponse1->StatusCode));
         }

      delete executeOptions;
      delete operationDetils;
   }
   catch (const Exception &e)
      {
         ShowMessage("Error: " + e.Message);
      }
}


Código:

void __fastcall TForm1::RecibirRespuesta(void)
{
   try {
      // Configurar el cliente REST
      RESTClient1->BaseURL = "http://192.168.1.138:8887/transaction/poll"; // Endpoint base
      RESTRequest1->Method = rmPOST; // Método HTTP

      // Crear el cuerpo de la solicitud (JSON)
      std::unique_ptr<TJSONObject> requestBody(new TJSONObject());
      requestBody->AddPair("pinpad", "*");

      // Asignar el cuerpo al RESTRequest
      RESTRequest1->ClearBody();
      RESTRequest1->AddBody(requestBody->ToString(), ctAPPLICATION_JSON);

      // Enviar solicitud
      RESTRequest1->Execute();

      // Procesar respuesta
      if (RESTResponse1->StatusCode == 200)
      {
         ShowMessage("Transacción exitosa");
      }
      else
         {
            ShowMessage("Error en la transacción: Código " + IntToStr(RESTResponse1->StatusCode));
         }
   }
   catch (const Exception &e)
      {
         ShowMessage("Error: " + e.Message);
         //Error 12029 No se pudo establecer conexión con el servidor
      }
}


Código:

void __fastcall TForm1::LeerArchivoJSON(const String& archivo)
{
   try
   {
      // Leer el archivo en un TStringList
      TStringList* archivoContenido = new TStringList();
      archivoContenido->LoadFromFile(archivo);

      // Parsear el contenido a un objeto JSON
      TJSONObject* jsonObj = (TJSONObject*)TJSONObject::ParseJSONValue(archivoContenido->Text);

      // Mostrar un valor específico (si existe la clave)
      if (jsonObj != NULL && jsonObj->GetValue("clave"))
      {
         String valor = jsonObj->GetValue("clave")->Value();
         ShowMessage("Valor de 'clave': " + valor);
      }

      // Liberar memoria
      delete archivoContenido;
      delete jsonObj;
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al leer el archivo JSON: " + e.Message);
   }
}


Código:

void __fastcall TForm1::CrearArchivoJSON(const String& archivo)
{
try
   {
      // Crear el objeto raíz
      TJSONObject* jsonObj = new TJSONObject();

      // Añadir un par clave-valor simple
      jsonObj->AddPair("nombre", "Ejemplo");

      // Crear un objeto anidado (detalles)
      TJSONObject* detalles = new TJSONObject();
      detalles->AddPair("edad", 58);
      detalles->AddPair("ocupacion", "Desarrollador");

      // Crear un array de habilidades
      TJSONArray* habilidades = new TJSONArray();
      habilidades->Add(new TJSONString("C++"));
      habilidades->Add(new TJSONString("Java"));
      habilidades->Add(new TJSONString("Python"));

      // Añadir el array al objeto "detalles"
      detalles->AddPair("habilidades", habilidades);

      // Añadir el objeto "detalles" al objeto raíz
      jsonObj->AddPair("detalles", detalles);

      // Crear un array de proyectos
      TJSONArray* proyectos = new TJSONArray();

      // Proyecto A
      TJSONObject* proyectoA = new TJSONObject();
      proyectoA->AddPair("nombre", "Proyecto A");
      proyectoA->AddPair("completado", true);
      proyectos->Add(proyectoA);

      // Proyecto B
      TJSONObject* proyectoB = new TJSONObject();
      proyectoB->AddPair("nombre", "Proyecto B");
      proyectoB->AddPair("completado", false);
      proyectos->Add(proyectoB);

      // Añadir el array de proyectos al objeto raíz
      jsonObj->AddPair("proyectos", proyectos);

      // Guardar el JSON en un archivo
      TStringList* archivoContenido = new TStringList();
      archivoContenido->Text = jsonObj->ToString();
      archivoContenido->SaveToFile(archivo);

      // Liberar memoria
      delete archivoContenido;
      delete jsonObj;

      ShowMessage("Archivo JSON complejo creado exitosamente.");
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al crear el archivo JSON: " + e.Message);
   }
}


Código:

void __fastcall TForm1::ModificarArchivoJSON(const String& archivo)
{
   try
   {
      // Leer el archivo JSON
      TStringList* archivoContenido = new TStringList();
      archivoContenido->LoadFromFile(archivo);

      // Parsear el contenido JSON
      TJSONObject* jsonObj = (TJSONObject*)TJSONObject::ParseJSONValue(archivoContenido->Text);

      if (jsonObj != NULL)
      {
         // Modificar valores en el JSON
         if (jsonObj->GetValue("nombre"))
         {
            //ALTERNATIVA que propone ChatGTP,
            jsonObj->RemovePair("nombre");//FUNCIONA
            jsonObj->AddPair("nombre", "JESUS");
         }

         // Modificar valores en un objeto anidado. NO FUNCIONA
         //Tengo que buscar alternativa para objetos anidados tal como la sentencia anterior
         if (jsonObj->GetValue("detalles"))
         {
            TJSONObject* detalles = (TJSONObject*)jsonObj->GetValue("detalles");
            if (detalles->GetValue("edad"))
            {
               detalles->GetValue("edad")->Value() = 66; // Cambiar la edad
            }
         }

         // Modificar valores dentro de un array. NO FUNCIONA
         //Tengo que buscar alternativa para objetos anidados tal como la sentencia anterior
         if (jsonObj->GetValue("proyectos"))
         {
            TJSONArray* proyectos = (TJSONArray*)jsonObj->GetValue("proyectos");

            // Modificar el primer proyecto
            if (proyectos->Count > 0)
            {
               TJSONObject* proyecto = (TJSONObject*)proyectos->Items[0];
               if (proyecto->GetValue("nombre"))
               {
                  proyecto->GetValue("nombre")->Value() = "CASIMIRO Proyecto Modificado";
               }
               if (proyecto->GetValue("completado"))
               {
                  proyecto->GetValue("completado")->Value() = "false"; // Cambiar a no completado
               }
            }
         }

         // Guardar los cambios al archivo
         archivoContenido->Text = jsonObj->ToString();
         archivoContenido->SaveToFile(archivo);

         ShowMessage("Archivo JSON modificado exitosamente.");
      }
      else
      {
         ShowMessage("El archivo JSON no pudo ser parseado.");
      }

      // Liberar memoria
      delete archivoContenido;
      delete jsonObj;
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al modificar el archivo JSON: " + e.Message);
   }
}


Código:

void __fastcall TForm1::LeerArrayJSON(const String& archivo)
{
   try
   {
      TStringList* archivoContenido = new TStringList();
      archivoContenido->LoadFromFile(archivo);
      TJSONObject* jsonObj = (TJSONObject*)TJSONObject::ParseJSONValue(archivoContenido->Text);

      if (jsonObj != NULL && jsonObj->GetValue("proyectos"))
      {
         TJSONArray* jsonArray = (TJSONArray*)jsonObj->GetValue("proyectos");
         for (int i = 0; i <jsonArray>Count; i++)
         {
            TJSONValue* valor = jsonArray->Items[i];
            ShowMessage("Elemento " + IntToStr(i) + ": " + valor->ToString());
         }
      }

      delete archivoContenido;
      delete jsonObj;
   }
   catch (const Exception& e)
   {
      ShowMessage("Error al leer el array JSON: " + e.Message);
   }
}

_________________
Muchos hombres no se equivocan jamás porque no se proponen nada razonable.
Volver arriba
Ver perfil de usuario Enviar mensaje privado Enviar email Visitar sitio web del autor
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.