Ejemplo para crear JSON a partir de Un Cursor Usando libreria JSON.PRG

326 views
Skip to first unread message

Norberto Mario Alvarez

unread,
Jan 8, 2020, 10:51:42 AM1/8/20
to Comunidad de Visual Foxpro en Español
Estimada Lista, viendo hilos sobre JSON, hay una librería JSON.PRG creada por Victor Spina. Yo tengo un cursor con los siguientes campos:

CREATE CURSOR C_CLF ;
 ( NCL N (6), SAL_ACRE C (20), SAL_DEU C (20))    
        

con varios registros

y en una variable cJSON coloco todos los registros

como genero la variable cJSON mediante JSON.PRG para luego mandarla a pa API de la siguiente manera:

cURL   = 'http://eldominio.com.ar/api/balances/?key=78f0be6f99e70016b542695a46f914a2'
oHTTP = CREATEOBJECT('Msxml2.ServerXMLHTTP.6.0')
oHTTP.OPEN("POST",  cURL , .F.)
*oHTTP.setRequestHeader("Content-Type", "application/json")
oHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')
oHTTP.SEND(cJSON)
IF oHTTP.status != 200
  cResponse = '{"Error": "No se logró la conexión con el Web Service.'+oHTTP.responseText+'"}'
ELSE
  cResponse = 'Se Transfirió los Saldos con Exito...!!!'
ENDIF
oHTTP = NULL
MESSAGEBOX(cResponse)

Desde ya muchas gracias por vuestra atención, y agradezco esta mano, ya que no logro hacerlo.

Norberto Alvarez
Buenos Aires, Argentina

HernanCano

unread,
Jan 8, 2020, 11:23:18 AM1/8/20
to Comunidad de Visual Foxpro en Español
Norberto:
En la forma como sea la estructura, y la estructura te la debieron haber dado los de ElDominio.com.

Norberto Mario Alvarez

unread,
Jan 8, 2020, 1:01:40 PM1/8/20
to Comunidad de Visual Foxpro en Español
Hola Hernan, gracias por contestar. La estructura es la siguiente:
Varios registros de:


code: 1
saldo_deudor: 4567,23
saldo_acreedor: 345,67

Se que mediante la librería JSON.prg a partir de un cursor o una tabla, genera el JSON en una variable, que sería la que enviaría a la API.

Norberto Álvarez
Buenos Aires, Argentina

HernanCano

unread,
Jan 8, 2020, 4:03:30 PM1/8/20
to Comunidad de Visual Foxpro en Español

#if .f.


code
: 1
saldo_deudor
: 4567,23
saldo_acreedor
: 345,67

#endif


** alternativa 1:
local M.cTexto
text to M
.cTexto noshow

"code": 1,
"saldo_deudor": 4567.23,
"saldo_acreedor": 345.67,

endtext


** alternativa 2:
local M.cTexto, M.cJSON
use DATOS shared noupdate
go top
M
.cJSON = ''
scan
   text to M
.cTexto textmerge noshow
   
{ "code": <<CAMPO1>>,
 
"saldo_deudor": <<CAMPO2>>,
 
"saldo_acreedor": <<CAMPO3>> }
   
   endtext
   M
.cJSON = M.cJSON + chr(13)+M.cTexto+","
endscan

** para quitar la última coma (probablemente no necesario, dependiendo de lo que te hayan dicho los de ElDominio.com)
M
.cJSON = left(M.cJSON,len(M.cJSON)+1)

StrToFile(M.cJSON,'DATOS-JSON.TXT')
** la vble M.cJON contiene lo que dices
** el archivo 'DATOS-JSON.TXT' también


** alternativa 3: usando JSON.PRG
**
** alguien te indicará....
**


**

Norberto Mario Alvarez

unread,
Jan 9, 2020, 8:27:40 AM1/9/20
to Comunidad de Visual Foxpro en Español
Hola Hernan, como siempre muy agradecido por tus respuestas, logro enviar datos al otro lado, pero ellos (los que manejan la API) reciben de la siguiente manera:

{"{\"ncl\"_:_999997,_\"sal_acre\"_:_\"30294,24\",_\"sal_deu\"_:_\"30294,22\"}":""} Fijate que aparece la primera llave { en rojo y la ultima :""} que yo no los envio, sino que solo lo reciben ellos, porque al guardarme lo que envio con el STRTOFILE, no existen estos caracteres y por lo tanto me lo rechazan, porque dicen que no deben venir. Ya probe con todas las alternativas que cortésmente me enviaste e inclusive mediante el JSON.PRG y sucede exactamente lo mismo También pienso, que, tal vez estoy renegando y el problema lo tienen ellos, y le echan la culpa al VFP. Gracias por tu atención Norberto Alvarez Buenos Aires, Argentina

Juan Perez

unread,
Jan 9, 2020, 1:57:27 PM1/9/20
to Comunidad de Visual Foxpro en Español
Buenos días a todos.

De ante mano, les agradezco cualquier ayuda que puedan brindarme.

Hace mucho tiempo elaboré un programa A que registra información de
clientes (son 3 tablas en total). El programa funciona en 4 computadoras
en una red local. A pesar de los años, lo siguen usando y no desean
cambiarlo (tienen varias razones que me han explicado), me han pedido
que la información del programa A, pueda visualizarse por internet.

Mi antiguo cliente, tiene una aplicación web en windows azure, para
otros procesos que maneja.

Lo que desea es visualizar la información de mi programa A en su
aplicativo web que funciona en windows azure.

No me autorizan a conectarme directamente a su sqlserver.

Revisando información, entiendo que debo enviar los datos de cada
transacción registrada en el programa A, a un webservices o wcf del
sofware en azure?, duplicar mis tablas de vfp en sqlserver de azure?

asi debe ser? hay alguna otra forma más eficiente? menos complicada? mas
segura?, etc.

tengo varias dudas? agradecería me den pistas para revisar información.

si tuvieran links con información para revisar como hacer esto, les
quedaría muy agradecido.

Saludos cordiales.

Juan.


Marco Plaza

unread,
Jan 9, 2020, 3:56:04 PM1/9/20
to Comunidad de Visual Foxpro en Español

Hola Norberto,

Si te fijas, en el request header estás indicando que en tipo de contenido es "x-www-form-urlencoded"..
 lo tenías bien como "application/json" y se ve que lo comentaste tal vez para probar:

*oHTTP.setRequestHeader("Content-Type", "application/json")
oHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

Al indicar que tu post data es www-form-urlencoded, el servidor espera un grupo 
de valores key/value que luego, según se ve, su api convierte a json:

{ "key1":value1, "key2":value2 .. etc }

Es por eso que tu cadena json es el primer valor y se muestra como el nombre 
de la primera propiedad ( key1 ) y el valor es vacío ( "" )  asi:

{ "tu json string con caracteres especiales escapados por el lado del servidor" : "" }

Saludos.

HernanCano

unread,
Jan 9, 2020, 10:19:47 PM1/9/20
to Comunidad de Visual Foxpro en Español
Norberto:
Es evidente que el problema lo tienes tú.
Debes ajustar los comandos/la lógica que estás usando.

Tomando en cuenta lo que te dice Marco, debieras hacer lo sgte:

Primero:
- Descomentar la sgte instruccón en lo que expusiste:
*oHTTP.setRequestHeader("Content-Type", "application/json")

- Comentar la sgte instrucción en lo que expusiste:
oHTTP.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded')

Probar.

Si todavía salen las dobles llaves, los guiones subrayado antes y después de los dos puntos, etc, entonces suprime las llaves en lo que yo te propuse.

Para no complicar más, haces lo que te digo y nos cuentas.

Norberto Mario Alvarez

unread,
Jan 10, 2020, 11:44:37 AM1/10/20
to Comunidad de Visual Foxpro en Español
Hola Gente, bueno, ahora reciben bien el JSON. Pero se me presentó otro inconveniente. Resulta que cuando hago el JSON con datos reales, y al ser estos demasiados, me tira el error de que la "Cadena tiene demasiados datos", hay alguna manera de corregir esto. Desde ya muchas GRACIAS.

Norberto Alvarez
Buenos Aires, Argentina

El miércoles, 8 de enero de 2020, 12:51:42 (UTC-3), Norberto Mario Alvarez escribió:

HernanCano

unread,
Jan 13, 2020, 1:28:51 AM1/13/20
to Comunidad de Visual Foxpro en Español
Bueno, Norberto....

>>> ... ahora reciben bien el JSON. Pero se me presentó otro inconveniente....

Si ya reciben bien el JSON, entonces envíalo así.....

Juan Perez

unread,
Jan 16, 2020, 9:51:50 PM1/16/20
to Comunidad de Visual Foxpro en Español
Hola,
hace unos días envié este mensaje..No obtuve respuesta.. no se si llegó
al grupo.

Espero alguien pueda compartirme ejemplos en visual foxpro de como
resolver este tema.
Saludos cordiales.
Juan.

Jose María Martín

unread,
Jan 17, 2020, 3:28:25 AM1/17/20
to Comunidad de Visual Foxpro en Español
Hola, 

Crea un nuevo mensaje exponiendo tu problema como hace todo el mundo en los foros. Meter tu problema por en medio de otro no es como funciona un foro (este o cualquiera). Es fácil ver que si llego al grupo viendo que tu mensaje está entre medias de los de la pregunta en la que nos hallamos. 

Un saludo. 
Reply all
Reply to author
Forward
0 new messages