PDA

Ver la Versión Completa : [Duda] JSON en Cobol...


Fito
7 de diciembre de 2017, 18:44
Hola Amigos:

Un cliente contrató un servicio web y para enviar y recibir datos (articulos, clientes, pedidos), tengo que utilizar una API que tienen y pasale y recibir parámetros en JSON. Adjunto un pdf con la explicación.

Mis conocimientos web son mínimos. Quisiera saber si alguien me puede ayudar como hacer esto.

Muchas Gracias.

Fito...

Fito
8 de diciembre de 2017, 20:30
Hola:

Buscando encontré este aporte de Rapinto, me parece que acá está la forma o me equivoco.

[Aporte] Ligar ao Site da União Europeia VAT Number - COBOL Foro (http://cobolforo.es/showthread.php?t=59&highlight=winhttp)

Kuk
9 de diciembre de 2017, 11:15
Fito, el JSON no es otra cosa que un formato definido. Sigue tratándose de datos en texto plano. En cuanto a la POST request, efectivamente, se puede adaptar los ejemplos que hay en el foro y hacerlas vía COM/OLE2. Así que, no te será fácil al principio, pero es, según yo, perfectamente realizable.

Fito
14 de diciembre de 2017, 15:26
Hola Amigos:

Les cuento que gracias al ejemplo de Rapinto y un poco de google, logré comunicarme con la api. Ahora estoy esperando que me envíen un token valido para empezar a probar a full.

Cuando tenga todo listo, voy a subir un ejemplo.

Saludos.

Fito...

---------- Post añadido : 11:26 ---------- Post anterior : 21:14 ----------

Hola Amigos:

Ya logré comunicarme con el webservice, enviarle parámetros y recibir la respuesta.

Esa respuesta está en un json, ahora la tarea es "entender" ese json. Hacerlo en Cobol me parece muy complicado.

Buscando, buscando y buscando, me topé con esto.

[Aporte] Google Maps localización - COBOL Foro (http://cobolforo.es/showthread.php?t=89&highlight=eslopes)

Pregunto a lo mejor una burrada, porque estos temas todavía escapan a mi cerebro.

De acuerdo a este ejemplo, yo podría trabajar el json en javascript, donde tengo buen manejo de este tipo de dato, pasarlo a un txt tipo tabla, y esa funcion llamarla desde cobol. Estoy muy errado? después leería ese txt desde cobol y santo remedio.

Diagn que si, jajajajaja.

Saludos.

Fito...

Rapinto
15 de diciembre de 2017, 01:00
Fito,

Não me parece muito complicado fazer uma rotina para abrir o ficheiro de texto
e tentar interpretar :
"PH_CODIGO": "02220160513111442",
"CL_CODIGO": "01554",
"PH_FECINI": "2016-05-13", .......

Se usares o unstring ou o perform varying ... talvez seja fácil, leres a informação que precisas.

Un Saludo,
Rui Pinto

Fito
15 de diciembre de 2017, 15:54
Hola Rui:

Sé que se puede hacer con cobol, el tema es el tiempo. Hacer y probar una rutina para interpretar el JSON me va a llevar mucho tiempo, que no tengo. Hay que tener en cuenta niveles, arrays y todas esas cosas. Cuando otros lenguajes lo tienen solucionado de manera sencilla.

En windev, por medio de una función (JSONtoVariant()) lo pasas a un array tipo variant y después con bucles anidados vas sacando todo. Por eso hice un exe en windev, que me lea el JOSN que lo grabo en un archivo, lo proceso y lo meto en otro archivo ya con el formato tipo tabla para leerlo desde cobol, trabajarlo así tipo batch.

Te pego un ejemplo (esto es una pequeña prueba, tengo que desarrollarlo para darle formato de tabla al txt de salida).

VP is Variant = JSONToVariant(sJson)

FileId = fCreate("d:\yeison\verpedidos.txt",foReadWrite)

FOR EACH m OF VP..Member
LineRead = m..Name
fWriteLine(FileId, LineRead)
FOR EACH m2 OF m..Member
LineRead = " --1-- " + m2..Name
fWriteLine(FileId, LineRead)
IF m2..Name = "cabecera" THEN
FOR EACH m3 OF m2..Member
LineRead = " --2-- "+m3..Name +":"+ m3..Value
fWriteLine(FileId, LineRead)
END
ELSE
FOR i = 1 TO m2..Occurrence
FOR EACH m3 OF m2[i]..Member
LineRead = " --3-- "+m3..Name +":"+ m3..Value
fWriteLine(FileId, LineRead)

END
END
END
END
END

fClose(FileId)


Muchas gracias por los aportes. Sigo probando y cuando tenga todo listo posteo el resultado.

Saludos.

Fito...

AHidalgo
2 de junio de 2021, 20:22
Hola Rui:

Sé que se puede hacer con cobol, el tema es el tiempo. Hacer y probar una rutina para interpretar el JSON me va a llevar mucho tiempo, que no tengo. Hay que tener en cuenta niveles, arrays y todas esas cosas. Cuando otros lenguajes lo tienen solucionado de manera sencilla.

En windev, por medio de una función (JSONtoVariant()) lo pasas a un array tipo variant y después con bucles anidados vas sacando todo. Por eso hice un exe en windev, que me lea el JOSN que lo grabo en un archivo, lo proceso y lo meto en otro archivo ya con el formato tipo tabla para leerlo desde cobol, trabajarlo así tipo batch.

Te pego un ejemplo (esto es una pequeña prueba, tengo que desarrollarlo para darle formato de tabla al txt de salida).

VP is Variant = JSONToVariant(sJson)

FileId = fCreate("d:\yeison\verpedidos.txt",foReadWrite)

FOR EACH m OF VP..Member
LineRead = m..Name
fWriteLine(FileId, LineRead)
FOR EACH m2 OF m..Member
LineRead = " --1-- " + m2..Name
fWriteLine(FileId, LineRead)
IF m2..Name = "cabecera" THEN
FOR EACH m3 OF m2..Member
LineRead = " --2-- "+m3..Name +":"+ m3..Value
fWriteLine(FileId, LineRead)
END
ELSE
FOR i = 1 TO m2..Occurrence
FOR EACH m3 OF m2[i]..Member
LineRead = " --3-- "+m3..Name +":"+ m3..Value
fWriteLine(FileId, LineRead)

END
END
END
END
END

fClose(FileId)


Muchas gracias por los aportes. Sigo probando y cuando tenga todo listo posteo el resultado.

Saludos.

Fito...

Estimados, les dejo la consulta para saber si pudieron resolver esto. Estoy con el mismo problema y no encuentro soluciones directas. Quiero desde Power Cobol conectarme a una API para bajar las ventas en la nube (me devuelve un json) e incorporarlas a mi sistema windows, ahora se hace manualmente y es una pérdida de tiempo.
Me podrán ayudar por favor?

Saludos
Ana

---------- Post añadido : 15:22 ---------- Post anterior : 12:32 ----------

@Kuk, Help!, me podrás ayudar? :nauf:

Saludos
Ana

Kuk
2 de junio de 2021, 20:57
@AHidalgo, hola.
Qué problema tienes exactamente? Para descargar el JSON o parsearlo?

AHidalgo
2 de junio de 2021, 21:33
@Kuk, hola, gracias por responder, empecemos desde el principio, probé algunas formas de conectarme a la API y aún no me funcionaron, si conoces alguna forma desde cobol directamente te lo agradecería.

Saludos
Ana

Kuk
2 de junio de 2021, 23:21
@AHidalgo, nunca lo he hecho, pero creo que se podrá hacer de manera similar a esto: [Aporte] Ligar ao Site da União Europeia VAT Number - COBOL Foro (https://www.cobolforo.es/showthread.php?t=59)

Aquí se trata de WSDL Soap, pasando por la clase COM de PowerCOBOL.

Tendrías que mirar ejemplos de cómo trabajar con JSON, pero al fin y al cabo sigue siendo una request HTTP también, o sea que debería funcionar.

Amigos, @Josber, @Nitzer, qué opináis?

Una vez el JSON obtenido, miraremos cómo parsearlo (creo recordar que hay bibliotecas en el foro, o lo mismo estudiamos cómo hacerlo por Java por ejemplo).

fastpho
3 de junio de 2021, 02:30
@AHidalgo, Hola Ana , son pocos los datos que nos has dado , como para ayudarte , ni tampoco cuales son las metodos que has probado....
Pero tenes varias formas de hacerlo , para comunicarte con la api podes hacerlo via clase COM ( WinHttp.WinHttpRequest.5.1)

Te paso un ejemplo:

WORKING-STORAGE SECTION.
*----------------------------------------------------------------------
* Variables para el Objeto WinHttpRequest
*----------------------------------------------------------------------
01 HttpJob pic x(128) value "WinHttp.WinHttpRequest.5.1".
01 WinHttpReq usage object reference OLE.
*> POST , GET , PUT
01 TipoEnvio pic x(4) value "POST".
* Verdero o falso dependiendo si la comunicacion es asyn - sync
01 OLE-TRUE PIC 1(1) BIT VALUE B"1".
01 OLE-FALSE PIC 1(1) BIT VALUE B"0".

01 ServerName pic x(256) value "http://contamen.com.ar/concursocobol/forerosdb.php".
01 JsonParametro pic x(256) value '[{"Action":"LeeAllForero"}]'. *> PHP Pide parametros json

01 status-resquest pic S9(9) COMP-5.
01 status-string pic x(256).
01 RespJson pic x(8192).
01 StringNull pic x value spaces.
*
* actualiza string que manda [{"fid":"5","fnombre":"emma","Action":"ActualizaForero","finfo":"estudiante","fcumple":"2006-12-06"}]
* insert string que manda [{"fnombre":"Lisi Urbano Moyano","Action":"InsertarForero","finfo":"Docente","fcumple":"1963-08-04"}]
*

*-------------------------------------------------
* variables para json - script.control
*-------------------------------------------------
01 jsCodigo pic X(8192).
01 jsonArray pic X(8192).
01 StringItemArray pic x(256).
01 scriptFuncion pic x(126) value "function js_arrayLength(a){if(a==null||a.length==null||a.le ngth==undefined){return 0}else return a.length;}js_arrayLength(arr)".
01 CantidadArray pic s9(9) comp-5.
01 ResultadoArray pic X(8192).

01 StringFuncion-Inicio. *> respuesta inicial del json
02 pic x(4) value 'arr['.
02 Indice pic 9(6).
02 pic x(3) value ']["'.

01 StringFuncion-Final. *> respuesta final del json
02 pic x(2) value '"]'.

01 PropObjCodigo pic x(3) value 'fid'. *> 4 enteros
01 PropObjNombre pic x(7) value 'fnombre'. *> 50 string
01 PropObjCumple pic x(7) value 'fcumple'. *> date formato aaaa-mm-dd
01 PropObjInfo pic x(5) value 'finfo'. *> 200 string

01 ArmoJson-General-Inicio.
02 pic x(2) value '[{'.
01 ArmoJson-General-Final.
02 pic x(2) value '}]'.

*-------------------------------------------------------------


*--------------------------
* variables para la tabla
*---------------------------
01 CamposSalida-Codigo pic x(4).
01 CamposSalida-Nombre pic x(50).
01 CamposSalida-Cumple.
03 C-SG pic xx.
03 C-AA pic xx.
03 filler pic x value "-".
03 C-MM pic xx.
03 filler pic x value "-".
03 C-DD pic xx.
01 CamposSalida-Info pic x(200).
01 LINEA-FECHA-AUX.
03 L1-D PIC XX.
03 filler pic x value "/".
03 L1-M PIC XX.
03 filler pic x value "/".
03 L1-S PIC XX.
03 L1-A PIC XX.
*---------------------------
* indices
01 I pic 9(6).
01 W-ROW pic s9(9) comp-5.
*-----------------------------------------
01 LINEA PIC X(1024).
01 OLE-ERROR-METHOD PIC X(256).
01 OLE-ERROR-INFO.
03 OLE-ERROR-TYPE PIC X(001).
03 OLE-ERROR-WCODE PIC X(002).
03 ROLE-ERROR-WCODE REDEFINES OLE-ERROR-WCODE PIC S9(04) COMP-5.
03 OLE-ERROR-SCODE PIC X(004).
03 ROLE-ERROR-SCODE REDEFINES OLE-ERROR-SCODE PIC S9(09) COMP-5.
PROCEDURE DIVISION.
DECLARATIVES.
OLE-ERROR SECTION.
USE AFTER EXCEPTION OLEEXCEPTION.
INVOKE EXCEPTION-OBJECT "GET-ERROR-TYPE"
RETURNING OLE-ERROR-TYPE.
* display "OLE-ERROR-TYPE: " , OLE-ERROR-TYPE.
IF OLE-ERROR-TYPE = "1"
INVOKE EXCEPTION-OBJECT "GET-SCODE" RETURNING ROLE-ERROR-SCODE
INVOKE EXCEPTION-OBJECT "GET-SCODE-TEXT" RETURNING LINEA
MOVE LINEA TO OLE-ERROR-METHOD
GO TO ERROR-EXIT
ELSE
INVOKE EXCEPTION-OBJECT "GET-WCODE" RETURNING OLE-ERROR-WCODE
INVOKE EXCEPTION-OBJECT "GET-SCODE" RETURNING OLE-ERROR-SCODE
* display " OLE-ERR-WCODE: " , OLE-ERROR-WCODE
* display " OLE-ERR-SCODE: " , OLE-ERROR-SCODE
GO TO ERROR-EXIT.

OLE-ERROR-MANEJO.
EXIT.
END DECLARATIVES.


Programa Section.

Comienzo.
*---------------------------
* Limpio Pantalla
move spaces to "Text" OF RESP-JSON.
move spaces to "Text" OF campo-estado.
move spaces to "Text" OF campo-registros.
INVOKE table2 "ClearTable".
INVOKE table2 "Refresh".

*---------------------------
* vacio la respuesta
*
INITIALIZE RespJson.
move spaces to RespJson.
*---------------------------
* Establece como lenguaje "VBScript" or "JScript".
move "JScript" to "Language" OF ScriptControl1.



*-----------------
INICIO-Peticion.


*-----------------------------
* Crea el objeto WinHttpRequest
invoke OLE "CREATE-OBJECT" using HttpJob returning WinHttpReq.
*------------------------------
* Open la HTTP request.
invoke WinHttpReq "OPEN" using TipoEnvio , ServerName , ole-true.
*---------------------------------------------------------------------------

*------------------------------
* Envia HTTP request.
invoke WinHttpReq "send" using JsonParametro.
*---------------------------------------------------------------------------
*------------------------------
* Espera la respuesta completa
invoke WinHttpReq "WaitForResponse" using ole-true.
*-------------------------------

*--------------------------------------------
* Muesta Estado de comunicacion

invoke WinHttpReq "get-StatusText" returning status-string.
invoke WinHttpReq "get-Status" returning status-resquest.
move status-resquest to "Text" OF campo-estado.
INVOKE campo-estado "Refresh".

* display "status de solicitud: " , status-resquest
if status-resquest not = 200 then
/ display "error"
exit program
end-if.
*-------------------------------
* Recibe la respuesta Cabecera
invoke WinHttpReq "GetAllResponseHeaders" returning RespJson.
*Muestro la resp pura en el campo
move RespJson to "Text" OF campo-cabecera.
INVOKE campo-cabecera "Refresh".

*-------------------------------------------------------------------
* Recibe la respuesta en formato json segun lo solicitado
invoke WinHttpReq "get-ResponseText" returning RespJson.
*-------------------------------
* Libera el objeto creado
set WinHttpReq to null.

*-----------------------------------------------------------------
*Muestro la resp pura en el campo
*Analizamos el Json con scriptcontrol.
move RespJson to "Text" OF RESP-JSON.
INVOKE RESP-JSON "Refresh".

FIN-Peticion.


PROCESO-Json.

*----------------------------------------------------------------------------
* Verifico la cantidad de array en la RespJson
* CantidadArray
* devuelve la cantidad de registros en el json

move RespJson to jsonArray.
perform Funcion-getArrayLenght thru END-Funcion-getArrayLenght.
*----------------------------------------------
* Muestro la cantidad de registros devueltos
*----------------------------------------------
move CantidadArray to "Text" OF campo-registros.
INVOKE campo-registros "Refresh".
*----------------------------------------------------------------------------
*indice tabla2.
MOVE 1 TO W-ROW.
*----------------------------------------------------------------------------
* Leo los registros de array en la RespJson
* de acuerdo a la CantidadArray
move 0 to Indice.
PERFORM VARYING I FROM 1 BY 1 UNTIL I > CantidadArray
* *> Primer Obj Codigo
move spaces to StringItemArray
string StringFuncion-Inicio delimited by size
PropObjCodigo delimited by size
StringFuncion-Final delimited by size
into StringItemArray
perform Funcion-getArrayItem thru END-Funcion-getArrayItem
move ResultadoArray to CamposSalida-Codigo



* *> Segundo Obj Nombre
move spaces to StringItemArray
string StringFuncion-Inicio delimited by size
PropObjNombre delimited by size
StringFuncion-Final delimited by size
into StringItemArray
perform Funcion-getArrayItem thru END-Funcion-getArrayItem
move ResultadoArray to CamposSalida-Nombre

* *> Tercer Obj Fecha
move spaces to StringItemArray
string StringFuncion-Inicio delimited by size
PropObjCumple delimited by size
StringFuncion-Final delimited by size
into StringItemArray
perform Funcion-getArrayItem thru END-Funcion-getArrayItem
move ResultadoArray to CamposSalida-Cumple
move C-SG TO L1-S
MOVE C-AA TO L1-A
MOVE C-MM TO L1-M
MOVE C-DD TO L1-D


* *> Cuartto Obj Informacion
move spaces to StringItemArray
string StringFuncion-Inicio delimited by size
PropObjInfo delimited by size
StringFuncion-Final delimited by size
into StringItemArray
perform Funcion-getArrayItem thru END-Funcion-getArrayItem
move ResultadoArray to CamposSalida-Info


add 1 to Indice
*
MOVE CamposSalida-Codigo TO POW-TEXT(W-ROW 1) OF TABLE2
MOVE CamposSalida-Nombre TO POW-TEXT(W-ROW 2) OF TABLE2
MOVE LINEA-FECHA-AUX TO POW-TEXT(W-ROW 3) OF TABLE2
MOVE CamposSalida-Info TO POW-TEXT(W-ROW 4) OF TABLE2
ADD 1 TO W-ROW

END-PERFORM.
*
*
FIN-PROCESO-Json.

TERMINO.
exit program.

*------------------------------------------------------------------
Funcion-getArrayLenght. *> funcion devuelve la cantidad de arrays
*------------------------------------------------------------------
* determina la cantidad de array's
move zeros to CantidadArray.
move spaces to jsCodigo.


string "var arr = "
jsonArray delimited by size into jsCodigo.
INVOKE ScriptControl1 "ExecuteStatement" USING jsCodigo.

INVOKE ScriptControl1 "Eval" USING scriptFuncion RETURNING CantidadArray.


END-Funcion-getArrayLenght. EXIT.
*getSimpleArrayItem
*---------------------------------------------------------------------------------------
Funcion-getArrayItem. *> lee los datos del array de acuerdo a la propiedad solicitada
*---------------------------------------------------------------------------------------

move spaces to jsCodigo.
move spaces to ResultadoArray.

string "var arr = "
jsonArray delimited by size into jsCodigo

INVOKE ScriptControl1 "ExecuteStatement" USING jsCodigo
INVOKE ScriptControl1 "Eval" USING StringItemArray RETURNING ResultadoArray.


END-Funcion-getArrayItem. EXIT.
*------------------------------------------------------------------




ERROR-EXIT.
exit PROGRAM.


y la otra para comunicarte puede ser via el control ScriptControl , luego para parsear el JSON que devuelve la api lo lees con la libreria ocx de chilkat

Te paso un ejemplo:

WORKING-STORAGE SECTION.
01 scriptCode pic x(32768).
01 script redefines scriptCode.
03 scriptCode1 pic x(8192).
03 scriptCode2 pic x(8192).
03 scriptCode3 pic x(8192).
03 scriptCode4 pic x(8192).
01 vbCRLF pic x(2) value X"0D0A".
01 Estado pic s9(5) comp-5 VALUE ZEROS.

01 ReturnValue pic s9(5) comp-5 VALUE ZEROS.
01 CantidadOBJ pic s9(9) comp-5 VALUE ZEROS.

01 IndiceArray pic s9(9) comp-5 VALUE ZEROS.
01 Indice pic 9(6).
****************
* campos array
****************
01 ObjuserId pic X(4).
01 ObjId pic X(4).
01 ObjTitle pic X(50).
01 ObjCompleted pic X(5).


01 ObJsolicitar pic x(200).
*01 ObjCampo pic x(30).
* JsonObject ActiveX Reference Documentation (https://www.chilkatsoft.com/refdoc/xChilkatJsonObjectRef.html)
01 POW-PCMLIST OBJECT REFERENCE POW-CLISTITEM.
01 WK-IDX PIC S9(9) COMP-5.

PROCEDURE DIVISION.
*---------------------------------------------------------------
* LEO usando script

INVOKE pow-self "ThruEvents".
move 11 to "MousePointer" OF pow-self.
move pow-true to "Visible" OF CmStatic30.


move "VBScript" to "Language" OF scriptControl1 *> default script language
move spaces to scriptCode

string
' Dim RespJson ' vbCRLF *>variables globales
' Dim Estado ' vbCRLF *>variables globales
' Sub FuncionLeer() ' vbCRLF
' Dim RespEstado , jsonresp ' vbCRLF
' set WinHttpReq = CreateObject("WinHttp.WinHttpRequest.5.1") ' vbCRLF
' Set fso=CreateObject("Scripting.FileSystemObject") ' vbCRLF
' Set Fic = fso.OpenTextFile("ejemplojson.txt", 8, True) ' vbCRLF *>creo el archivo
' ' vbCRLF
' WinHttpReq.Open "GET", "https://jsonplaceholder.typicode.com/todos", False ' vbCRLF *> url
' ' vbCRLF
' WinHttpReq.Send() ' vbCRLF
' WinHttpReq.WaitForResponse() ' vbCRLF
' jsonresp = WinHttpReq.ResponseText ' vbCRLF
* ' msgbox jsonresp ' vbCRLF
' RespEstado = WinHttpReq.Status ' vbCRLF
' Estado = RespEstado ' vbCRLF
' RespJson = jsonresp ' vbCRLF
' RespJson = "{""Objeto"":" & RespJson & "}" ' vbCRLF *>agrego un objeto a la resp
' fic.Writeline(RespJson) ' vbCRLF *> escribo las respjson en el archivo
' fic.Close() ' vbCRLF *> cierro el archivo
' End Sub ' vbCRLF
delimited by size into scriptCode1
end-string


INVOKE scriptControl1 "Reset".

invoke scriptControl1 "AddCode" using scriptCode.

invoke scriptControl1 "ExecuteStatement" using "FuncionLeer".

invoke scriptControl1 "Eval" using "Estado" returning Estado.

move 0 to "MousePointer" OF pow-self
move pow-false to "Visible" OF CmStatic30.
move Estado to "Text" OF campo-estado.


*--------------------
* anda perfecto leyendo un archivo con un object = {"objeto":[.......]}
INVOKE ChilkatJsonObject1 "LoadFile" USING "C:\fsc5\winhttpDemoElsis\ejemplojson.txt" RETURNING ReturnValue
* display "resultado load:" , ReturnValue
if ReturnValue not = 1 then
INVOKE pow-self "DisplayMessage" USING "error"
exit program
end-if.

move "Size" OF ChilkatJsonObject1 to CantidadOBJ.

* display "ChilkatJsonObject1 size Objeto:" , CantidadOBJ.


INVOKE ChilkatJsonObject1 "SizeOfArray" USING "Objeto" RETURNING IndiceArray

* display "IndiceArray: " , IndiceArray.
move IndiceArray to "Text" OF campo-registros.


***********************************
* busco un registro x
*arranca desde 0 el primer registro

move 149 to Indice.
MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"userId" delimited by size
into ObJsolicitar

END-STRING
INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjuserId.

MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"id" delimited by size
into ObJsolicitar

END-STRING.
INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjId.

MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"title" delimited by size
into ObJsolicitar

END-STRING
INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjTitle.

MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"completed" delimited by size
into ObJsolicitar

END-STRING.
INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjCompleted.

MUESTRO-REGISTRO-X.
MOVE ObjuserId TO "Text" OF CmText1.
MOVE ObjId TO "Text" OF CmText2.
MOVE ObjTitle TO "Text" OF CmText3.
MOVE ObjCompleted TO "Text" OF CmText4.


*
*

*
*
*
MUESTRO-TODOS-REGISTROS.
move ZEROS to Indice.
PERFORM VARYING Indice FROM Indice BY 1 UNTIL Indice = IndiceArray
INVOKE CMLISTVIEW1 "Add" USING 1 1 RETURNING WK-IDX

MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"userId" delimited by size
into ObJsolicitar

END-STRING
INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjuserId

MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"id" delimited by size
into ObJsolicitar

END-STRING
INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjId

MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"title" delimited by size
into ObJsolicitar

END-STRING
INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjTitle

MOVE SPACES TO ObJsolicitar
STRING "Objeto[" delimited by size
Indice delimited by size
"]" delimited by size
"." delimited by size
"completed" delimited by size
into ObJsolicitar

END-STRING

INVOKE ChilkatJsonObject1 "StringOf" USING ObJsolicitar RETURNING ObjCompleted
IF WK-IDX > 0 THEN
MOVE "ListItems"(WK-IDX) OF CMLISTVIEW1 TO POW-PCMLIST
MOVE ObjuserId TO "Text"(1) OF POW-PCMLIST
MOVE ObjId TO "Text"(2) OF POW-PCMLIST
MOVE ObjTitle TO "Text"(3) OF POW-PCMLIST
MOVE ObjCompleted TO "Text"(4) OF POW-PCMLIST

INVOKE CMLISTVIEW1 "Refresh"
END-IF


end-perform.


Saludos

AHidalgo
3 de junio de 2021, 17:08
@Kuk, Gracias!!, pruebo con eso.
Saludos
Ana

Kuk
3 de junio de 2021, 23:49
@AHidalgo, échale un vistazo al ejemplo de @fastpho, me parece que es justo lo que necesitas ;)

AHidalgo
4 de junio de 2021, 00:29
@fastpho, Gracias!!!, sigo probando la conexion con la API, el proveedor no brinda soporte, hay que arreglarse como se pueda.
Pruebo con esto que me pasas y sino les vuelvo a preguntar, mil gracias!!

Saludos
Ana

Josber
7 de junio de 2021, 11:55
Amigos, @Josber, @Nitzer, qué opináis?

Hola a todos, antes de nada, perdón por la tardanza pero, tengo las cosas complicadas y no puedo aparecer mucho por aquí, solo lo justo para leer lo nuevo y poco más.

A ver, no he tocado JSON, pero yo creo que tienes razón @Kuk, una vez obtenido, lo difícil es el parseo y, supongo que habrán librerías gratuitas para hacerlo, al igual que las habrán para, por ejemplo, los archivos XML

Un salu2.-

AHidalgo
10 de junio de 2021, 17:08
@Kuk, @fastpho, gracias ambos por su ayuda!, luego de muuuchas pruebas con la API RestFull del proveedor y de mucho dolor de cabeza, por una lado encontré que la API esta muy mal hecha, tiene muchos errores que no se capturan, incluido cuando una consulta no tiene datos :cens:
Desde la conexión a la API que ni siquiera funciona con cualquiera de los soft que se prueban normalmente las APIs, solamente con la pagina que ellos proveen para pruebas.
Por todo lo ante dicho, la única forma que encontré que funciona es:
- desde Power Cobol ejecuto un control CmDDE1 con el nombre del archivo BAT.
- previo haber generando el bat con un CURL con todos los parámetros solicitados,
- me devuelve el token en un texto plano, lo leo desde Power Cobol y guardo.
- genero otro bat con el token y la consulta que necesito,
- ejecuto nuevamente el bat con un CmDDE1 y guardo en otro archivo plano la respuesta y el estado de la respuesta por si el token caducó y debo generarlo nuevamente.

En este punto estoy intentando generar una función que me desglose el JSON de la respuesta (parseo) para guardar los datos en formato cobol.

Por casualidad, tienen alguna rutina o función que haga esto?, pregunto para no inventar la rueda.
No puedo usar otros soft que lo hagan porque hasta donde he visto son pagos o versión Trial y no me sirve pues esto lo tengo que instalar luego en mi cliente.

Quedo al pendiente de sus sugerencias!
Saludos
Ana

Kuk
10 de junio de 2021, 17:28
solamente con la pagina que ellos proveen para pruebas
No será problema de que el servidor tiene restricción de interrogación de la API para evitar ataques? Es una medida de seguridad estándar, deshabilitarlo por defecto y dar acceso expresamente a tal o tal IP.

tienen alguna rutina o función que haga esto?
Has visto esto? [Aporte] Código para recibir archivo json y leerlo - COBOL Foro (https://www.cobolforo.es/showthread.php?t=1301)

AHidalgo
10 de junio de 2021, 21:00
@Kuk, no lo había visto, gracias!, estuvo mirando las herramientas de chilkatsoft pero son pagas, ahora me fijo lo que pone @fastpho.

Saludos
Ana

AHidalgo
2 de julio de 2021, 00:42
@Kuk, @fastpho, hola nuevamente, aquí estoy de vuelta (luego de una gripe familiar), he estado probando con el ActiveX de Chilkat viendo el ejemplo pero no logro que me levante ni la cantidad en array.
Adjunto un ejemplo del JSON que tengo que parsear. En la prueba que hice adapté los texto de acuerdo a mi estructura de datos pero no logré que me levante lo que necesito.
Me podrán ayudar?

Saludos
Ana

AHidalgo
2 de julio de 2021, 19:23
Estimados, desestimen, ya esta resuelto, a veces un buen sueño soluciona todo. :duerme:

Saludos
Ana

Nitzer
2 de julio de 2021, 22:07
El json, como el xml, al final son archivos de texto, como decía @Kuk con un formato establecido, lo que toda la vida hemos llamado "chorizos".
Nosotros los coboleros tenemos la suerte que no hemos necesitado de esos formatos ya que podíamos "mapearlos" con variables.
De hecho yo sigo utilizándolo y con bases de datos :).

Para la comunicación no os puedo ayudar, en mi equipo tengo gente experta en .net y yo lo que hago es generar el fichero, se lo paso a ellos (me hacen un exe) y me devuelven un valor 0,1 indicando si ha sido todo correcto o no :)