Crear un cursor a partir de un archivo txt que contiene un Json

985 views
Skip to first unread message

norberto.ma...@gmail.com

unread,
Oct 23, 2022, 10:31:32 AM10/23/22
to Comunidad de Visual Foxpro en Español
Hola Grupo, queria hacerle una consulta. Mediante un método GET consumo una API y traigo un txt en formato Json, y el mismo quiero generar un cursor para poder trabajarlo en mi sistema. La Consulta alguien tiene un ejemplo de como hacer esto, porque no se por donde empezar. Desde ya muchas gracias y espero una mano, para resolverlo.

Norberto Alvarez
Buenos Aires, Argentina

Hendell Mora

unread,
Oct 23, 2022, 1:23:45 PM10/23/22
to publice...@googlegroups.com
Formato del json

--
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.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/publicesvfoxpro/03eb9a7f-cb77-495e-bd95-2301baa72295n%40googlegroups.com.

Edwin Duran

unread,
Oct 23, 2022, 2:34:25 PM10/23/22
to Comunidad de Visual Foxpro en Español

Victor Espina

unread,
Oct 24, 2022, 9:12:19 AM10/24/22
to Comunidad de Visual Foxpro en Español
Va a depender mucho del formato del json.  Si el mismo es un array de objetos donde cada objeto contiene las mismas propiedades y estas propiedades son escalares (string, number, boolean), entonces el método ToCursor de mi librería JSON puede generarte un cursor con esa data de forma automática.  

Victor Espina

norberto.ma...@gmail.com

unread,
Oct 24, 2022, 10:00:42 AM10/24/22
to Comunidad de Visual Foxpro en Español
Hola, desde ya agradezco vuestras respuestas, les adjunto un txt que me devuelve con el formato Json que tengo para transformar en cursor. Gracias de antemano

Norberto Alvarez
Buenos Aires, Argentina

txt_json.txt

Hendell Mora

unread,
Oct 24, 2022, 12:25:04 PM10/24/22
to publice...@googlegroups.com
Text To lcStr NoShow
[{"id":89,"first_name":"Juan","last_name":"Perez","email":"ju...@dominio.com.ar","password":"$2y$10$BCDs.ZulLh1s6qLk39kzM.CdyO\/xD07FAeHQMuyzhVU5v6cHWY\/9G","permissions":null,"last_login":"2022-02-17 08:59:31","created_at":"2022-02-17 08:59:31","updated_at":"2022-02-17 08:59:31","phone":"5555666666","address_one":"Hhhhhhyy","address_two":"Uuuuuuuu","city":"37","zip_code":"666666","country":null,"state":"B","pricelist":1,"lista_de_portal":1,"tipo_factura":"Sin especificar","documento":null,"api_token":null,"created_for_id":null,"sector_id":null,"enabled_cc":0,"saldo_maximo":null,"punto_venta_id":null,"codigo_venta":null,"membership_id":null,"membership_enabled":null,"new":1,"code":null}]
ENDTEXT

obj = _Screen.Json.Parse(lcStr)

* Make a copy of the internal array from obj.data
Acopy(obj._, aEmployeeList)

* Now pass the aEmployeeList by reference with '@'
lcJsonArray = _Screen.Json.Encode(@aEmployeeList)

* Convert the JSONArray into VFP CURSOR **(this is cool)**
_Screen.Json.JSONToCursor(lcJsonArray, "qEmployees")
BROWSE







--
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.

Irwin Rodriguez

unread,
Oct 24, 2022, 12:48:10 PM10/24/22
to publice...@googlegroups.com
Hola Hendell,

No hace falta convertir el string a objeto, solo hay que invocar JSONToCursor() directamente:

Text To lcStr NoShow
[{"id":89,"first_name":"Juan","last_name":"Perez","email":"ju...@dominio.com.ar","password":"$2y$10$BCDs.ZulLh1s6qLk39kzM.CdyO\/xD07FAeHQMuyzhVU5v6cHWY\/9G","permissions":null,"last_login":"2022-02-17 08:59:31","created_at":"2022-02-17 08:59:31","updated_at":"2022-02-17 08:59:31","phone":"5555666666","address_one":"Hhhhhhyy","address_two":"Uuuuuuuu","city":"37","zip_code":"666666","country":null,"state":"B","pricelist":1,"lista_de_portal":1,"tipo_factura":"Sin especificar","documento":null,"api_token":null,"created_for_id":null,"sector_id":null,"enabled_cc":0,"saldo_maximo":null,"punto_venta_id":null,"codigo_venta":null,"membership_id":null,"membership_enabled":null,"new":1,"code":null}]
ENDTEXT

_Screen.json.JSONToCursor(lcStr, 'miCursor', SET("Datasession"))
browse

Un saludo.

Hendell Mora

unread,
Oct 24, 2022, 12:50:45 PM10/24/22
to publice...@googlegroups.com
Mejor aún. Excelente

IngeSis Ingeniería & Sistemas

unread,
Oct 24, 2022, 7:13:12 PM10/24/22
to Comunidad de Visual Foxpro en Español
Buenas noches... les comparto este que pasa el Json a un cursor/dbf.
*-------------------------------------------------------------------------------------------------------------------------------*
* Json a DBF / Recibe un Json y Crea un CURSOR con sus Campos Json / Todos tipo String Tamaño 80. Retorna .T. si Crea JsonDbf.DBF ó <nameFile.DBF>
*-------------------------------------------------------------------------------------------------------------------------------*
PROCEDURE JsonToTabla(lcString as String) as Logical
    USE IN SELECT("JsonDbf")    && Cierro Tabla a Crear
    ERASE JsonDbf.dbf
    JTT = CHRTRAN(CHRTRAN(CHRTRAN(lcString,CHR(13),""), CHR(10),""), CHR(9),"")    && Quito Enter + SaltosLínea + Tab
    JTT = STRTRAN(JTT,[" : "],[":"])    && Quito Espacios para contar Objetos dentro de {}
    JTT = IIF(LEFT(JTT,1)='[', JTT, "["+JTT+"]")
    IF LEFT(JTT,1)="[" AND RIGHT(JTT,1)="]"    && [ ]
        nObj = OCCURS("}", JTT) && Nº Objetos adentro = "Registros" = Filas del Array
        cCampos = ""
        oReg = CHRTRAN(STREXTRACT(JTT,"{","}",1), ["], [])
        nCam = OCCURS([:],oReg)    && Nº Campos a crear = Columnas Array
        DIMENSION ArrayCam[IIF(nObj>0,nObj,1), IIF(nCam>0,nCam,1)]        && Array para Valores [Fil,Col]
        FOR i = 1 TO nObj
            oReg = CHRTRAN(STREXTRACT(JTT,"{","}",i), ["], [])
            * Solo en Objeto 1 creo el Vector de "Campos".
            IF i=1
                FOR j=1 TO nCam        && Veo los campos:valores
                    cam = GETWORDNUM(oReg, j, [,])
                    cCampos = cCampos + IIF(EMPTY(cCampos),"",[, ]) + GETWORDNUM(cam,1,":") + " C(80)"
                ENDFOR
                cCampos = CHRTRAN(cCampos,CHR(13),"")
            ENDIF
            * Lleno Array con los Valores
            FOR j=1 TO nCam
                ArrayCam(i,j) = STREXTRACT(oReg,[:], IIF(j=nCam,"",[,]), j)
            ENDFOR
        ENDFOR
        * CREO LA TABLA solo si la Cadena cCampos viene con Valor. Y agrego valores del Array
        cCampos = STRTRAN(cCampos, "saldoPrevio", "saldoPrev")    && CORTO de 11 caracteres a 9. Solo es válido hasta 10.
        IF !EMPTY(cCampos)
            JsonT = IIF(VARTYPE(nameFile)='C', nameFile, "JsonDbf")
            CREATE TABLE &JsonT (&cCampos)
            APPEND FROM ARRAY ArrayCam
            USE    && Cierro la Tabla
        ENDIF
        nResul = IIF(EMPTY(cCampos),.F.,.T.)    && Si creo cursor reporta .T. sino .F.
    ENDIF
    RETURN IIF(VARTYPE(nResul)='L', nResul, .F.)
ENDPROC

norberto.ma...@gmail.com

unread,
Oct 24, 2022, 7:27:52 PM10/24/22
to Comunidad de Visual Foxpro en Español
Hola Irwin Rodriguez, una ultima consulta. Del siguiente codigo, no me tira ningún error, pero no me sale nada del browse. En que le estoy pifiando?. Gracias por todo

DO JSON

LOCAL txt_json
txt_json = ""

LOTOKEN='?key=78f0be6f99e70016b542695a46f914a2'
CURL = 'https://joaquin.dominio.com.ar/api/clientes_nuevos/?key=78f0be6f99e70016b542695a46f914a2'
LOREQUEST = Createobject('MsXml2.XmlHttp')
Comprop(LOREQUEST,'UTF8',1)
LOREQUEST.Open("GET",CURL)
LOREQUEST.SETREQUESTHEADER('Content-Type','application/json')
LOREQUEST.SETREQUESTHEADER('Authorization',LOTOKEN)
LOREQUEST.Send(.Null.)
Do While LOREQUEST.READYSTATE <> 4
  DoEvents Force
ENDDO

LOREQUEST.RESPONSETEXT

Text To txt_json NoShow


_Screen.json.JSONToCursor(txt_json, 'miCursor', SET("Datasession"))
browse


Norberto Alvarez
Buenos Aires, Argentina

Irwin Rodriguez

unread,
Oct 25, 2022, 3:55:27 AM10/25/22
to publice...@googlegroups.com
Esa configuración creo que no está bien. Si te fijas el parámetro key forma parte de la URL pero también se está enviando vía header, además la respuesta del servidor es 12007 la cual se refiere a que no ha podido resolver la dirección. Asegúrate de conseguir bien la URL y una vez que obtengas la respuesta correcta y el string JSON entonces ya podemos mirar la conversión de la JSONFox.app.

Un saludo.

norberto.ma...@gmail.com

unread,
Oct 25, 2022, 7:43:43 AM10/25/22
to Comunidad de Visual Foxpro en Español
Hola Irwin Rodriguez, desde ya muchas gracias por tu respuesta. Te mando el código con la url, donde obtengo el Json. Gracias!!!!!

DO JSON

LOCAL txt_json
txt_json = ""

LOTOKEN='?key=78f0be6f99e70016b542695a46f914a2'

LOREQUEST = Createobject('MsXml2.XmlHttp')
Comprop(LOREQUEST,'UTF8',1)
LOREQUEST.Open("GET",CURL)
LOREQUEST.SETREQUESTHEADER('Content-Type','application/json')
LOREQUEST.SETREQUESTHEADER('Authorization',LOTOKEN)
LOREQUEST.Send(.Null.)
Do While LOREQUEST.READYSTATE <> 4
  DoEvents Force
ENDDO

LOREQUEST.RESPONSETEXT

Text To txt_json NoShow
_Screen.json.JSONToCursor(txt_json, 'miCursor', SET("Datasession"))
browse


Norberto Alvarez
Buenos Aires, Argentina

Victor Espina

unread,
Oct 25, 2022, 10:18:03 AM10/25/22
to Comunidad de Visual Foxpro en Español
Intente probar tu codigo pero el webservice no responde, a pesar de que arme el request idéntico a como lo tienes en el codigo:

Screen Shot 2022-10-25 at 11.16.13.png

Por otro lado, no veo sentido en enviar el token como parámetro URL y como header en el request, sin mencionar que dudo mucho que el token real empiece con "?key=".

Saludos

Victor Espina

Victor Espina

unread,
Oct 25, 2022, 2:41:10 PM10/25/22
to Comunidad de Visual Foxpro en Español
Y, encima, tu servidor esta inyectando algun tipo de troyano en la respuesta:

Screen Shot 2022-10-25 at 15.39.30.png

Victor Espina

Norberto Mario Alvarez

unread,
Oct 25, 2022, 6:42:23 PM10/25/22
to Comunidad de Visual Foxpro en Español
Hola Victor, desde ya muchas gracias por contestarme, no pude antes porque estuve todo el dia dando vueltas por la calle. Efectivamente estaba mal el dominio y a continuación te lo paso correctamente. Esto es solo una parte, porque también voy a interactuar enviando datos que voy a tener que hacer lo mismo pero al revés. Como tambien me indicas, y por tu experiencia que veo que es muchísima Maestro, como la de Irwin Rodríguez. Mi pregunta es que me recomiendan en este escenario? , porque el metodo GET que les estoy exponiendo lo fui sacando de distintos foros, ya que tengo cero experiencia con las API y Webservice. Desde ya muchas gracias por su colaboración, la cual la agradezco.

DO JSON

LOCAL txt_json
txt_json = ""

LOTOKEN='?key=78f0be6f99e70016b542695a46f914a2'

LOREQUEST = Createobject('MsXml2.XmlHttp')
Comprop(LOREQUEST,'UTF8',1)
LOREQUEST.Open("GET",CURL)
LOREQUEST.SETREQUESTHEADER('Content-Type','application/json')
LOREQUEST.SETREQUESTHEADER('Authorization',LOTOKEN)
LOREQUEST.Send(.Null.)
Do While LOREQUEST.READYSTATE <> 4
  DoEvents Force
ENDDO

? LOREQUEST.RESPONSETEXT


Text To txt_json NoShow
_Screen.json.JSONToCursor(txt_json, 'miCursor', SET("Datasession"))
browse


Norberto Alvarez
Buenos Aires, Argentina


Victor Espina

unread,
Oct 26, 2022, 11:17:58 AM10/26/22
to Comunidad de Visual Foxpro en Español
Ok, ahora si funciona.  Hice este pequeño programa de ejemplo para mostrar como manejar el tema con la librería JSON:

CLOSE ALL
CLEAR ALL
CLEAR

DO JSON

LOCAL cToken,cUrl
cToken='?key=78f0be6f99e70016b542695a46f914a2'
cUrl = 'https://joaquin.santerialacatedral.com.ar/api/clientes_nuevos/'

LOCAL oResp
oResp = JSON.httpGet(cUrl + cToken)
IF oResp.hasError
   ?oResp.errorMsg
   RETURN
ENDIF

JSON.toCursor(oResp.json, "QTEST1", SET("DATASESSION"))
IF JSON.lastError.hasError
   ?JSON.lastError.MEssage
   RETURN
ENDIF

SELECT qtest1
EDIT

CLOSE ALL


Tuve que hacer un pequeño ajuste en la librería para manejar valores en NULL, asi que si ya la habías descargado por favor descárgala de nuevo y asegúrate que tienes la version 1.18.   El otro cambio que hice fue que no es necesario pasar el header Authorization porque ya estas pasando el token como un parámetro en el url y funciona de esa forma.

Espero te sirva.

Saludos

Victor Espina

Victor Espina

unread,
Oct 26, 2022, 11:19:15 AM10/26/22
to Comunidad de Visual Foxpro en Español
Olvide incluir el screenshot del resultado :)

Screen Shot 2022-10-26 at 12.02.34.png

Norberto Mario Alvarez

unread,
Oct 26, 2022, 12:57:00 PM10/26/22
to Comunidad de Visual Foxpro en Español
Hola Victor, desde ya muchas gracias y funcionó perfecto!!!!!. Nuevamente muchas gracias por tu aporte!!!!!!

Norberto Alvarez
Buenos Aires, Argentina

Norberto Mario Alvarez

unread,
Oct 26, 2022, 1:20:31 PM10/26/22
to Comunidad de Visual Foxpro en Español
Hola Victor, te molesto con otra consulta: ahora tengo además otro escenario pero con api/facturas_pendientes
supuestamente la respuesta es la foto que adjunto. La pregunta es como debo manejarlo con tu libreria?. Desde ya muchas gracias, super agradecido!!!

Norberto Alvarez
Buenos Aires, Argentina

respuesta.png

Victor Espina

unread,
Oct 26, 2022, 4:34:03 PM10/26/22
to Comunidad de Visual Foxpro en Español
Funciona igual que con el ejemplo anterior.  La única diferencia es que la columna "products", al ser un array,  se creara como una columna MEMO y adentro se va grabar el string JSON correspondiente para cada registro.  Entonces, con el JSON.toCursor() vas a obtener un cursor con la lista de facturas, y para obtener otro cursor con el detalle de una factura en especifico harías:

JSON.toCursor(qfacturas.products, "qproducts", SET("DATASESSION"))


Saludos

Victor Espina

Norberto Mario Alvarez

unread,
Oct 27, 2022, 2:30:20 PM10/27/22
to Comunidad de Visual Foxpro en Español
Muchisimas Gracias Victor, por tu ayuda y aporte a esta gran comunidad foxera!!!!!!!! 

Norberto Alvarez
Buenos Aires, Argentina

Norberto Mario Alvarez

unread,
Oct 28, 2022, 10:34:29 AM10/28/22
to Comunidad de Visual Foxpro en Español
Hola Victor, una pequeña consulta, al compilar el sistema me aparece este mensaje al ejecutar el mismo, que debo hacer? Gracias

Norberto Alvarez
Buenos Aires, Argentina

mensaje.png

Victor Espina

unread,
Oct 28, 2022, 12:24:40 PM10/28/22
to Comunidad de Visual Foxpro en Español
Cuando descargas la librería en tu proyecto, debes hacer DO JSON desde la ventana de comandos de VFP para que se descargue cualquier dependencia que pueda tener la librería.  Una vez hecho eso, ya puedes compilar normalmente y no necesitas hacerlo de nuevo en el futuro.

Victor Espina
Reply all
Reply to author
Forward
0 new messages