 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Jue 12 Dic, 2024 6:15 pm Asunto: Manipulación OBJETOS JSON |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 13 Dic, 2024 4:00 am Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 13 Dic, 2024 7:57 am Asunto: |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Vie 13 Dic, 2024 2:19 pm Asunto: |
|
|
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 |
|
 |
JesúsGandia Master


Registrado: 17 Jul 2004Mensajes: 403Ubicación: Gandia, Valencia
|
Publicado: Vie 13 Dic, 2024 3:37 pm Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|