Como generar un JSON en VFP 9.2

395 views
Skip to first unread message

Juan Miguel Solis

unread,
Nov 27, 2025, 6:50:37 AMNov 27
to Comunidad de Visual Foxpro en Español
Bueno sigo con el tema e verifactu, ahora necesito generar un JSON par el tema del verifactu, para enviarlo con una llamada  RESTful de tipo PUT a una direccion https://............

En fin si alguien tiene algo de esto estaría muy agradecido por la ayuda.

Un saludo

Victor Espina

unread,
Nov 27, 2025, 7:23:23 AMNov 27
to Comunidad de Visual Foxpro en Español
Si es un JSON sencillo lo puedes generar con un simple TEXT - ENDTEXT.  Si tienes un objeto que necesitas expresar como un string JSON, te recomiendo mi libreria JSON.

Saludos

Victor Esina

Juan Miguel Solis

unread,
Nov 27, 2025, 7:58:33 AMNov 27
to publice...@googlegroups.com
No sencillo no es, porque tengo que meter como 80 campos o así dependiendo varias cosas. 

Como se usa tu librería, hay algún manual ?

Dónde ja consigo?

Un saludo 


--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/publicesvfoxpro/XETROAjrFEk/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/55a11a7a-3df0-441d-bff5-903b71c68b16n%40googlegroups.com.

Zarlu

unread,
Nov 27, 2025, 8:21:29 AMNov 27
to Comunidad de Visual Foxpro en Español
Buenos días Juan Miguel!

Creo que el maestro Victor con sencillo se refiere a la estructura.
Y con automatización, es decir una rutina para generarlo, es rápido.
Usa su herramienta. o puedes implementar la tuya recorriendo campos para obtener nombres de campos y sus valores,
si son campos fijos será más sencillo.

Ésta es una muestra de un json que recién generé con un editor de texto, se guarda con la extensión .json

[
{
  "id": "1-5-3",
  "etiqueta1": "PODER Y REVOCACIÓN DE PODER",
  "etiqueta2": "Revocación de Poder persona física",
  "modo": "tasa",
  "tasaConcepto": 40
},  
{
  "id": "1-5-4",
  "etiqueta1": "PODER Y REVOCACIÓN DE PODER",
  "etiqueta2": "Revocación de Poder persona moral",
  "modo": "tasa",
  "tasaConcepto": 49
},  
{
  "id": "1-5-5",
  "etiqueta1": "PODER Y REVOCACIÓN DE PODER",
  "etiqueta2": "Notificación de Revocación de Poder",
  "modo": "tasa",
  "tasaConcepto": 55
}
]

Algunos comentarios...
Cada par de llaves encierran un registro (row)
En cada linea un campo y su dato
Delimitar cada campo y registro con una coma
El  último registro o campo no lleva la coma
Nombres de campos en minúsculas
Usar dos puntos (:) en lugar del signo de igual (=)
Valores de texto entre comillas, números sin comillas, verdadero (.t. ) true, falso (.f.) false

Suerte
zarlu
Chetumal, Quintana Roo, México

Juan Miguel Solis

unread,
Nov 27, 2025, 8:48:02 AMNov 27
to publice...@googlegroups.com
Muchas gracias como siempre por la info, veré esa librería JSON, para usarla que tendría que hacer añadirla al proyecto ? Como 

Un saludo

Sergio Rojas

unread,
Nov 27, 2025, 8:50:15 AMNov 27
to publice...@googlegroups.com

La librería de Victor es muy buena, sobre todo para leer devoluciones largas. Para Json de pocos elementos, modo texto es lo más rápido.

Saludos

Sergio

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/b89d9524-3829-457e-9bfd-2629394d3eb6n%40googlegroups.com.

Juan Miguel Solis

unread,
Nov 27, 2025, 8:58:04 AMNov 27
to publice...@googlegroups.com
No no son pocos elementos, es para generar lus registros del verifactu, en su versión CSV son 80 campos 😃😃

Un saludo 

Daniel Sánchez

unread,
Nov 28, 2025, 12:41:22 PMNov 28
to publice...@googlegroups.com
Saludos Victor, habría alguna forma de indicar que cuando se maneje valores verdadero/falso en vez de colocar true/false ponga 0/1.

Seria excelente ya que al grabar en un campo de texto el json en una tabla en sql server el sql server tiene sus funciones que pueden leer o trabajar directamente con el json almacenado, si mando true/false me da error en los campos que son lógicos bajo vfp.
Sería excelente pudieras permitir trabajar con las dos formas con los valores lógicos, tal como lo hace ahora o con 0 y 1 si se desea.
Otro punto que he notado lentitud es cuando tengo un campo de texto con un valor binario o que almacena el contenido de un archivo en base64 el cual se obtuvo con filetostr y aplicado strconv, y el objeto lo paso por json este demora demasiado con este tipo de datos que son algo grandes y pesados, podrá optimizarse.

Gracias por la atención prestada maestro Victor



--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.


--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software SAC
Móvil y WhatsApp +051-949398047 / Móvil 948615385
Trujillo - Perú

P  Sugerimos no imprimir este e-mail a menos que sea absolutamente necesario. Protejamos el medio ambiente.

Victor Espina

unread,
Dec 1, 2025, 10:02:07 AMDec 1
to Comunidad de Visual Foxpro en Español
Acabo de subir una nueva version que implementa la propiedad mssqlCompat (boolean) de modo que puedas activarr la compatibilidad con SQL Server.  Con ese moo activo, JSON ya puede generar y leer JSONs que sean compatibles con SQL Server.

Saludos

Victor Espina

Daniel Sánchez

unread,
Dec 3, 2025, 9:13:00 PMDec 3
to publice...@googlegroups.com
Excelente Victor lo máximo, siempre colaborando con la comunidad, muchas gracias.

Saludos

Miguel A.

unread,
Dec 7, 2025, 12:11:45 PMDec 7
to Comunidad de Visual Foxpro en Español
Te vendría bien apuntarte a este grupo de WhatsApp: +34 606587319 VFPx - SII - Veri*factu - Factura Electrónica. 53 miembros .

Juan Miguel Solis

unread,
Dec 7, 2025, 3:59:55 PMDec 7
to publice...@googlegroups.com
Me uno al grupo de whatssap según me aconsejarte.

Un saludo 

--
Blog de la Comunidad Visual FoxPro en Español http://comunidadvfp.blogspot.com
---
Has recibido este mensaje porque estás suscrito a un tema del grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este tema, visita https://groups.google.com/d/topic/publicesvfoxpro/XETROAjrFEk/unsubscribe.
Para cancelar la suscripción a este grupo y a todos sus temas, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/fc198bd7-4397-49b7-9f3f-eb8a2324bbdfn%40googlegroups.com.

Juan Miguel Solis

unread,
Dec 9, 2025, 3:02:56 PM (13 days ago) Dec 9
to Comunidad de Visual Foxpro en Español
Hola Zarlu

Estoy intentado enterder la JSON.prg de Victor Espina, pero se me hace muy complicado,, de momento lo unico que hice fue:

SET PROCEDURE TO foxbarcodeqr.prg ADDITIVE
SET PROCEDURE TO json.prg ADDITIVE

Pero claro, se supone que tengo que instanciar un objeto, para crear el JSON, pero en los ejemplos que veo que directamente se dan valores   "etiqueta1": "PODER Y REVOCACIÓN DE PODER", pero esto en realidad, no es asi porque en realidad el valor de "Etiqueta1": estaría en un campo pero aqui aparece ya como un literal no como el valor de un campo y ahí es donde me lio, como instancio el objeto y declaro las variables para que, luego me aparezca algo como lo que me ha mostrado ?

id": "1-5-5",
  "etiqueta1": "PODER Y REVOCACIÓN DE PODER",
  "etiqueta2": "Notificación de Revocación de Poder",
  "modo": "tasa",
  "tasaConcepto": 55

Perdona si te he liado un poco :)

Un saludo

Hendell Mora

unread,
Dec 9, 2025, 3:35:26 PM (13 days ago) Dec 9
to publice...@googlegroups.com

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/ead88e76-7767-4d0f-9a05-35f879e5a023n%40googlegroups.com.

Zarlu

unread,
Dec 9, 2025, 3:41:50 PM (13 days ago) Dec 9
to Comunidad de Visual Foxpro en Español
Buenas tardes Juan Miguel!

Sin problema, con gusto en lo que pueda te apoyo.

En palabras simples json es una estructura de datos.

 "etiqueta1": "PODER Y REVOCACIÓN DE PODER", 
Asemejando la línea anterior a una tabla el valor al lado izquierdo de los dos puntos es el nombre del campo y al lado derecho el dato.
Un conjunto de estas líneas entre llaves forman un row.
Un conjunto de varios Rows forman el json, al que llamaré tabla.
(Por supuesto el json tiene otras características propias en su estructura )

"nombre_campo": "dato";

Comentas que son muchos campos y de ahí la sugerencia de que uses la herramienta del maestro Víctor para automatizar la generación del json.

Preguntas...
Cuál es la estructura de la tabla de donde formarás el json?
Podrías mostrar como debe quedar el envió del json?

Me haré de la herramienta del maestro Víctor para poder apoyarte un poco más. Pero requiero la estructura de tus datos para una mejor ilustración

Suerte
zarlu
Chetumal, Quintana Roo, México

Juan Miguel Solis

unread,
Dec 9, 2025, 3:54:37 PM (13 days ago) Dec 9
to publice...@googlegroups.com
Ok, mañana te envío un ejemplo y gracias por la ayuda

Un saludo 

Zarlu

unread,
Dec 9, 2025, 5:01:54 PM (13 days ago) Dec 9
to Comunidad de Visual Foxpro en Español
Qué tal Juan Miguel!

A ver si te sirve esto:

CLEAR
CREATE CURSOR datos (nombre c(10), Apellido c(10), edad i)
INSERT INTO datos Values("JUAN", "PEREZ", 55)
? "Datos del cursor:"
? nombre,apellido,edad
? "--------------------"
*Text para JSON
TEXT TO textJson TEXTMERGE NOSHOW ADDITIVE
{
<<LOWER(FIELD(1))>>: "<<ALLTRIM(nombre)>>",
<<LOWER(FIELD(2))>>: "<<ALLTRIM(apellido)>>",
<<LOWER(FIELD(3))>>: <<edad>>
}
ENDTEXT
DO json
oVES = json.Parse(textJson)
? "Datos del JSON como objeto:"
? oVES.nombre,  oVES.apellido, oVES.edad
? "--------------------"
*JSON a cadena
? "Objeto JSON a cadena:"
lcString=json.Beautify(oVES)
? lcString

Suerte
zarlu
Chetumal, Quintana Roo, México


Juan Miguel Solis

unread,
Dec 10, 2025, 5:37:55 AM (13 days ago) Dec 10
to publice...@googlegroups.com
Hola Zarlu

Como puedes ver es algo mas complicado, te envío un ejemplo, pero adeams la idea es que tengo que hacer una llamada POST ( POST    https://api-test.puentesif.com/api/issued-invoices/register

Enviado esta API-Key

 KEY_B0FQSV9LRVkSQ0FQUF9DSE5IN1ZPS0szVUxVJDVhZjEwNDZkLTJhZWUtNGNiMS1iNzU4LWU2OWY3NjgxODFhZsA0GKKaAQAAFWZJczhrTlRVUUVDS3gwdHF3M1c5QQ==


Pero como hago la llamada POST ?

y a continuación el JSON, generado que me imagino que sera el fichero que cree me imagino que me deberé crear una dbf, para ir guardado los datos que necesito y luego irlos llevando al JSON según vaya necesitando no ?


****** Ejemplo de un JSON 

{

    "UserId": "PEYIE2",

    "CompanyFiscalId": "B82998097",

    "Invoices": [

        {

            "Establecimiento": "00",

            "Serie": "F",

            "Numero": "26112",   // Nº Factura

            "FechaExpedicion": "2025-11-26",

            "FechaOperacion": null,

            "Descripcion": "DESCRIPCION FACTURA",

            "ImporteTotal": 121.00,

            "ImporteRetencionSoportada": 0.00,

            "EsSimplificada": false,

            "EsSustitutivaSimplificada": false,

            "TipoFactura": "F1",

            "TipoEmisor": 1,

            "Moneda": "EUR",

            "TipoCambio": 1.00,

            "Idioma": "ES",

            "FormaDePago": "Transferencia",

            "contraparte": {

                "Denominacion": "GESISA S.L. TEST",

                "TipoFiscal": 0,

                "IdFiscal": "B08810434",

                "TipoIdFiscal": 0,

                "address": {

                    "Direccion": "calle",

                    "Poblacion": "BARCELONA",

                    "CodigoPostal": "08001",

                    "Province": "BARCELONA",

                    "CodigoPais": "ES"

                },

                "Contactos": [

                    {

                        "Id": 0,

                        "CounterpartId": 0,

                        "Nombre": "ANDREU",

                        "Apellido": "MORENO",

                        "CorreoElectronico": "amo...@gesisa.net"

                    },

                    {}

                ]

            },

            "DetalleRectificacion": {

                "CodigoFacturaRectificativa": null,

                "TipoFacturaRectificativa": null,

                "DetalleFacturas": []

            },

            "Payments": [

                {

                    "Id": 0,

                    "Type": 2, //VALOR FIJO

                    "Medio": 9,

                    "Descriptions": "transferencia a 30dias",

                    "Fecha": "2024-07-30",

                    "Importe": 121.00,

                    "InvoiceId": 0

                }

            ],

            "DetalleFactura": [

                {

                    "Id": 0,

                    "TipoDesgloseOperacion": 0,

                    "InversionSujetoPasivo": false,

                    "Descripcion": "TRASLADO PERSONAL TECNICO 1",

                    "Unidades": 1.00000000,

                    "ImporteUnitario": 50.000000,

                    "CosteUnitario": 0.0,

                    "Descuento": 0.00000000,

                    "TipoIVA": 21.00,

                    "TipoRE": 0.00,

                    "CausaExencion": null,

                    "CausaNoSujeta": null,

                    "SubtotalLinea": 50.00000000,

                    "Position": 1,

                    "Clave": "01",

                    "UserDefinedData": {},

                    "InvoiceId": 0

                },

                {

                    "Id": 0,

                    "TipoDesgloseOperacion": 0,    // Españolas 0, extranjeras 1 Productos, 2 Servicios

                    "InversionSujetoPasivo": false,

                    "Descripcion": "TRASLADO PERSONAL TECNICO 2",

                    "Unidades": 1.00000000,

                    "ImporteUnitario": 50.000000,

                    "CosteUnitario": 0.0, // Fijo 0.0

                    "Descuento": 0.00000000,

                    "TipoIVA": 21.00,

                    "TipoRE": 0.00,

                    "CausaExencion": null,

                    "CausaNoSujeta": null,

                    "SubtotalLinea": 50.00000000,

                    "Position": 2,

                    "Clave": "01",

                    "UserDefinedData": {},

                    "InvoiceId": 0

                }

            ]

        }

    ]

}


Un saludo



Message has been deleted

Zarlu

unread,
Dec 10, 2025, 9:33:10 AM (13 days ago) Dec 10
to Comunidad de Visual Foxpro en Español
Buenos días Juan Miguel!

Definitivo. Lo que intentas lograr consta de varios pasos, diferentes procedimientos para estructurarse, conectarse y obtener lo deseado.
Verifactu debe tener documentación al respecto, cada WS es particular y hay que apegarse a sus indicaciones.
Para los ajenos suele ser complicado por las autorizaciones, contraseñas....

Dices " ...imagino que me deberé crear una dbf,..."
Por supuesto! Es la base y ya  deberías tenerla. La información de cada factura, y sus detalles, debe estar contenida en bases de datos/tabla para de ahí tomarse la información para calcular, generar, visualizar, imprimir...en incluso para lo que ahora requieres.

Me parece que no necesitas un "fichero" json sino más bien la información con estructura json . No vas a crear un archivo, si al caso una variable con la información con estructura json que adjuntarás a la solicitud.

Mira éste ejemplo simple de una factura y su detalle:
{
"factura": 12,
"cliente": "LUIS",
"detalle": [
                { "producto": "Arroz", "precio": 120},
                { "producto": "Frijol", "precio": 20} 
                ]
}

Si tomas el ejemplo que te adjunté en mi mensaje anterior lo que necesitas  es con TEXT...ENDTEXT  meter la estructura que te solicitan y reemplazar los datos con los nombres de los campos donde tengas almacenada la información.

Una porción de lo último que subiste:
TEXT TO textJson TEXTMERGE NOSHOW  

{

    "UserId": "<<campouserid>>",

    "CompanyFiscalId": " <<campofiscalid>> ",

    "Invoices": [

        {

            "Establecimiento": " <<campoestablecimiento>> ",

            "Serie": "<<camposerie>>",

.....
.....

Creo que en el foro que facturación que te recomendaron ya deben tener código armado que te facilitará lo que requieres.
Si se te complica entender lo del  json  imitalo. Ya con el uso cotidiano lo desenredarás.

(para lo de POST documentate sobre soapUI para pruebas)

Suerte
zarlu
Chetumal, Quintana Roo

Juan Miguel Solis

unread,
Dec 10, 2025, 9:53:29 AM (13 days ago) Dec 10
to publice...@googlegroups.com
Buenos dias Zarlu

Bueno me meteré con esto, armare la dbf para tener todos los datos y veo cómo montar esto.

gracias por la ayuda a entenderlo un poco :) :)


Sergio Rojas

unread,
Dec 10, 2025, 9:56:16 AM (13 days ago) Dec 10
to publice...@googlegroups.com

Juán

Por el ejemplo que pasaste del JSON y tu falta de experiencia, yo veo más factible que lo manejes en forma de texto y no como objeto. Porque se ve que tendrías anidado objeto dentro de objeto que sería doble parseo.

Saludos

Sergio

Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/CA%2BBv44XJzFBrz5OfE5JP0T0syyeuTqwWJQoNcKY_x%2BX8qKJBHg%40mail.gmail.com.

Victor Espina

unread,
Dec 11, 2025, 2:34:11 PM (11 days ago) Dec 11
to Comunidad de Visual Foxpro en Español
Como te explique por correo, la forma correcta de cargar la libreria JSON es con DO JSON y no con SET PROCEDURE.  Tu JSON de ejemplo se puede representar facilmente con la clase DynObj que te pase:

// Nivel raíz objeto = CREATE("DynObj") objeto.UserId = "PEYIE2"; objeto.CompanyFiscalId = "B82998097"; // Array Invoices como Collection objeto.Invoices = CREATE("Collection"); // Crear primer invoice invoice = CREATE("DynObj"); invoice.Establecimiento = "00"; invoice.Serie = "F"; invoice.Numero = "26112"; invoice.FechaExpedicion = "2025-11-26"; invoice.FechaOperacion = null; invoice.Descripcion = "DESCRIPCION FACTURA"; invoice.ImporteTotal = 121.00; invoice.ImporteRetencionSoportada = 0.00; invoice.EsSimplificada = false; invoice.EsSustitutivaSimplificada = false; invoice.TipoFactura = "F1"; invoice.TipoEmisor = 1; invoice.Moneda = "EUR"; invoice.TipoCambio = 1.00; invoice.Idioma = "ES"; invoice.FormaDePago = "Transferencia"; // Objeto contraparte dentro del invoice invoice.contraparte = CREATE("DynObj"); invoice.contraparte.Denominacion = "GESISA S.L. TEST"; invoice.contraparte.TipoFiscal = 0; invoice.contraparte.IdFiscal = "B08810434"; invoice.contraparte.TipoIdFiscal = 0; // Address dentro de contraparte invoice.contraparte.address = CREATE("DynObj"); invoice.contraparte.address.Direccion = "calle"; invoice.contraparte.address.Poblacion = "BARCELONA"; invoice.contraparte.address.CodigoPostal = "08001"; invoice.contraparte.address.Province = "BARCELONA"; invoice.contraparte.address.CodigoPais = "ES"; // Contactos como Collection invoice.contraparte.Contactos = CREATE("Collection"); // Primer contacto contacto1 = CREATE("DynObj"); contacto1.Id = 0; contacto1.CounterpartId = 0; contacto1.Nombre = "ANDREU"; contacto1.Apellido = "MORENO"; contacto1.CorreoElectronico = "amo...@gesisa.net"; invoice.contraparte.Contactos.add(contacto1); // Segundo contacto vacío contacto2 = CREATE("DynObj"); invoice.contraparte.Contactos.add(contacto2); // DetalleRectificacion invoice.DetalleRectificacion = CREATE("DynObj"); invoice.DetalleRectificacion.CodigoFacturaRectificativa = null; invoice.DetalleRectificacion.TipoFacturaRectificativa = null; invoice.DetalleRectificacion.DetalleFacturas = CREATE("Collection"); // Payments como Collection invoice.Payments = CREATE("Collection"); // Primer pago pago1 = CREATE("DynObj"); pago1.Id = 0; pago1.Type = 2; pago1.Medio = 9; pago1.Descriptions = "transferencia a 30dias"; pago1.Fecha = "2024-07-30"; pago1.Importe = 121.00; pago1.InvoiceId = 0; invoice.Payments.add(pago1); // DetalleFactura como Collection invoice.DetalleFactura = CREATE("Collection"); // Primer detalle factura detalle1 = CREATE("DynObj"); detalle1.Id = 0; detalle1.TipoDesgloseOperacion = 0; detalle1.InversionSujetoPasivo = false; detalle1.Descripcion = "TRASLADO PERSONAL TECNICO 1"; detalle1.Unidades = 1.00000000; detalle1.ImporteUnitario = 50.000000; detalle1.CosteUnitario = 0.0; detalle1.Descuento = 0.00000000; detalle1.TipoIVA = 21.00; detalle1.TipoRE = 0.00; detalle1.CausaExencion = null; detalle1.CausaNoSujeta = null; detalle1.SubtotalLinea = 50.00000000; detalle1.Position = 1; detalle1.Clave = "01"; detalle1.UserDefinedData = CREATE("DynObj"); detalle1.InvoiceId = 0; invoice.DetalleFactura.add(detalle1); // Segundo detalle factura detalle2 = CREATE("DynObj"); detalle2.Id = 0; detalle2.TipoDesgloseOperacion = 0; detalle2.InversionSujetoPasivo = false; detalle2.Descripcion = "TRASLADO PERSONAL TECNICO 2"; detalle2.Unidades = 1.00000000; detalle2.ImporteUnitario = 50.000000; detalle2.CosteUnitario = 0.0; detalle2.Descuento = 0.00000000; detalle2.TipoIVA = 21.00; detalle2.TipoRE = 0.00; detalle2.CausaExencion = null; detalle2.CausaNoSujeta = null; detalle2.SubtotalLinea = 50.00000000; detalle2.Position = 2; detalle2.Clave = "01"; detalle2.UserDefinedData = CREATE("DynObj"); detalle2.InvoiceId = 0; invoice.DetalleFactura.add(detalle2); // Agregar invoice a la colección objeto.Invoices.add(invoice);
y luego usas el metodo httpPost de JSON para enviar el request:

oResp = JSON.httpPost("url", objeto.getObject(), "headers")


Revisa la documentacion en linea para un ejemplo mas detallado de como usar httpPOST.

Saludos

Victor Espina

Jose Antonio Blasco

unread,
Dec 12, 2025, 5:31:04 AM (11 days ago) Dec 12
to publice...@googlegroups.com
Buenos días Victor, 
La clase "DynObj" está incluida en JSON.PRG o es externa ??
Y para que sirve ?

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2



Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/7922c8b2-b709-4c40-9040-cbec6c73076dn%40googlegroups.com.

Juan Miguel Solis

unread,
Dec 12, 2025, 7:32:54 AM (11 days ago) Dec 12
to publice...@googlegroups.com
Buenos dias Victor 

Muchas gracias por responder lo primero, lo de hacer DO JSON, eso esta claro pèro mi duda al no entender muy bien eso y ya veo el esfuerzo que has realizado, lo que no termino de entender es lo siguiente (bueno lo separe así para intentar entenderlo mejor :) :) :) veo que se crea el Objeto TEST (por ejemplo), que es el que al final tendré que enviar como sea dentro del HTTPOST,, y veo que se crea el Objeto y cuando se quierea hacer referencia a una propiedad de ese objeto se se nombra como siempre objeto.xxxxx , luego dentro del objeto creas colecciones invoices, y dentro de ahai defines las propiedades (establecimiento,  Serie, número, etc.), puedes crear luego más objetos que se pueden anidar ( invoice.contraparte ), que a su vez tiene las propiedades que definas y esta anidarse más (invoice.contraparte.address),  Con sus propiedades y estos en el JSON iran anidados, ¿ cuando quieres crear un grupo nuevos añades otra colección ?  ¿ Lo que esté al mismo nivel estará dentro de la misma colección ? y lo último de momento :) , ¿ como termina de meter datos el objeto TEST, porque a nivel raíz se declara el objetos test, luego test.invoice ?, y lo último de momento :) :) aqui los valores los pones como literales, pero muchos son datos que vendrán de un campo de tabla, esto como seria :

invoice.Serie = aqui iria el valor del campo tablaserie.nserie ?

// Nivel raíz TEST = CREATE("DynObj") TEST.UserId = "PEYIE2";  TEST .CompanyFiscalId = "B82998097";

 // Array Invoices como Collection   TEST.Invoices = CREATE("Collection"); 

etalle2);

 // Agregar invoice a la colección objeto.Invoices.add(invoice);


Perdona el mail tan largo, pero es para ver si creo que me he enterado.

Un saludo y gracias por tu inestimable ayuda.



El jue, 11 dic 2025 a las 20:34, Victor Espina (<vesp...@gmail.com>) escribió:

Victor Espina

unread,
Dec 12, 2025, 10:42:00 AM (11 days ago) Dec 12
to Comunidad de Visual Foxpro en Español
No, DynObj es un utilitario que uso internamente en mis codigos.  Es una case que permite crear un objeto cuyas propiedade se definen automaticamente cuanddo le asignas un valor.  Es muy util para crear objetos dinamicamente sin escribir de mas:

* DYNOBJ.PRG
* Dynamic properties object
*
DEFINE CLASS dynobj AS Custom

PROTECTED _object

PROCEDURE Init
THIS._object = CREATEOBJECT("EMPTY")
RETURN

PROCEDURE THIS_Assign(pcPropName, puPropValue)
STORE puPropValue TO ("THIS._object." + pcPropName)
RETURN

PROCEDURE THIS_Access(pcPropName)
    pcPropName = LOWER(pcPropName)
    DO CASE        
        CASE TYPE("THIS._Object") = "L" OR INLIST(pcPropName,"_object","tostring","getobject","clone")
    RETURN THIS
   
    OTHERWISE
    IF NOT PEMSTATUS(THIS._object, pcPropName, 5)
ADDPROPERTY(THIS._object, pcPropName, NULL)
ENDIF
    RETURN THIS._Object
ENDCASE

PROCEDURE ToString
    IF TYPE("JSON.Name") <> "C"
    RETURN ""
    ENDIF
RETURN JSON.Stringify(THIS._Object)

PROCEDURE getObject
RETURN THIS._Object

PROCEDURE Clone(plGetObject)
LOCAL oClon,cProp,nProp,nProps
LOCAL ARRAY aProps[1]
oClon = CREATEOBJECT("DynObj")
nProps = AMEMBERS(aProps, THIS._Object, 0)
FOR nProp = 1 TO nProps
cProp = aProps[nProp]
STORE GETPEM(THIS._Object, cProp) TO ("oClon." + cProp)
ENDFOR
RETURN IIF(plGetObject,oClon.getObject(),oClon)
ENDDEFINE



El uso es muy simple:

oPersona = CREATE("DynObj")
oPersona.nombre = "Jose"
oPersona.apellido = "Urdaneta"
oPersona.edad = 20

?oPersona.nombre ---> "Jose"


Si quieres obtener un objeto EMPTY con las propiedades y sus valores, haces:

oObjeto = oPersona.getObject()
?oObjeto.edad --> 20

y tambien puedes crear una copia del objeto:

oCopia = oPersona.clone();
oCopia.edad = 25
?oPersona.edad --> 20


Saludos

Victor Espina

Victor Espina

unread,
Dec 12, 2025, 10:45:30 AM (11 days ago) Dec 12
to Comunidad de Visual Foxpro en Español
Esa es la gracia de DynObj; las propiedade se crean automaticamente al asignarle un valor.  Esto quiere decir que si quieres agregar otra propiedad al objeto TEST simplemente le asignas un valor y ya:

TEST.propiedad = valor

efectivamente objetos que esten en el mismo nivel apareceran en el JSON en el mismo nivel.  El string JSON mantendra la misma estructura jerarquica que tenga el objeto que le pases a httpPOST.

Saludos

Victor Espina

Jose Antonio Blasco

unread,
Dec 12, 2025, 11:09:06 AM (11 days ago) Dec 12
to publice...@googlegroups.com
Muchas gracias Victor 
!!! Es genial !!!

Un saludo.

Jose A. Blasco
Zaragoza - España
Visual FoxPro 9 SP2


Has recibido este mensaje porque estás suscrito al grupo "Comunidad de Visual Foxpro en Español" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a publicesvfoxp...@googlegroups.com.
Para ver este debate, visita https://groups.google.com/d/msgid/publicesvfoxpro/91caf88d-88a7-4488-a66b-8f49f1239434n%40googlegroups.com.
Reply all
Reply to author
Forward
0 new messages