Problema con JSON y 4GL - Forum - PUG Spanish CALA - Progress Community
 Forum

Problema con JSON y 4GL

This question is answered

Buenos días, que grato es poder hacer una pregunta y leer respuestas en nuestro idioma!!!

Estoy trabajando con openedge 11.6.4 (arranqué en su momento con la 8.3, año 2004), en sistema linux y la programación en 4GL e interfaz CHUI (modo consola).

Estoy haciendo una consulta REST, la cual en el response obviamente me devuelve los encabezados y un JSON todo guardado en un LONGCHAR. 

A esta altura no se si vengo haciendo bien las cosas, ya que tengo que manipular el LONGCHAR para sacar los encabezados y que quede solo el JSON (cosa que en entorno GUI, con las librerías .NET es todos más fácil).
Resulta ser que el JSON al final tiene 2 atributos ("offset":0,"totalRows":7) que provocan que la sentencia READ-JSON devuelva error. 

Alguien me puede dar una manito, porque no se me ocurre otra cosa que recorrer el LONGCHAR letra por letra hasta encontrar los 2 atributos y eliminarlos. UN GARRON!!! debería existir algo más sencillo y que uno lo desconozca.

Desde ya, muchas gracias y dejo a continuación el LONGCHAR con el response.

HTTP/1.1 200 OK
X-Powered-By: Express
X-RateLimit-Limit: 0
X-RateLimit-Remaining: 0
date: Fri, 18 May 2018 11:41:54 GMT
content-type: application/json
Transfer-Encoding: chunked
Strict-Transport-Security: max-age=15768000
Set-Cookie: DXLB=1; path=/
Cache-control: private

3b3

{"rows":[{"_id":"99e6ff2a-49b4-4f06-b66e-572f65909e01","name":"Y","robotId":"2d37b7e2-c26d-4180-9bee-109dec805786","robotName":"Yaguar"},{"_id":"15cfed98-51e9-4ed4-b146-6f5be1320d3c","name":"V","robotId":"c05aa707-4cb5-4815-b51d-7e91dedc92a1","robotName":"Vital"},{"_id":"2c674fa1-a9f5-4757-bdc4-3e3c7cb21553","name":"Mi","robotId":"dd772831-722f-4630-a3b6-31aa197294c9","robotName":"Micropack"},{"_id":"0fa3a123-f5f2-47e3-b2d6-9a9183158217","name":"Mk","robotId":"be14bae3-5e6b-4478-95ba-a6e2355e722b","robotName":"Makro"},{"_id":"6bd4ce9b-934c-44de-8da5-35c578aee798","name":"Mc","robotId":"b4170a9a-816e-4cc3-af7c-462a08b6f004","robotName":"Maxiconsumo"},{"_id":"0c7bd89b-89e7-4755-9971-fb76709bba1b","name":"LA","robotId":"9283d51b-e3b1-411d-a1ec-e4c982fd2cc6","robotName":"LaAnonima"},{"_id":"6b
6c9bf0-4482-4b3c-b41a-ae26f08785c5","name":"HL","robotId":"238bb63a-7fa5-4287-b00a-d5c479dae33e","robotName":"Libertad"}],"offset":0,"totalRows":7}
0

Verified Answer
  • Momento... ¿READ-JSON de una TT?¿o READ-JSON de un objeto JSON?

    Si es de una TT/Dataset, sin duda va a fallar y es razonable que lo haga, porque no hay "dónde meter" esos atributos.

    Si es de un JSON-X (no lo uso, por lo que no se bien cuál es el nombre), no debería fallar y deberías verlo con soporte técnico de Progress (asumiendo que tenés una licencia con soporte vigente, sino no te van a dar ni bola).

    Si estás tratando de usar eso para una TT, no te queda otra que eliminar esos atributos "extra". Si la estructura del JSON es siempre la misma, lo más simple es:

    SUBSTRING(jsonlc,R-INDEX(']',jsonlc) + 1, LENGTH(jsonlc)) = '~}'.

All Replies
  • No creo que esos atributos sean un problema, dado que el JSON parece estar bien.

    Lo que no está bien es el 0, luego de la llave de cierre del JSON.

    Antes de hacer un READ-JSON, deberías:

    SUBSTRING(jsonlc,1,INDEX('~{',jsonlc) - 1) = ''.

    SUBSTRING(jsonlc,R-INDEX('~}',jsonlc) + 1, LENGTH(jsonlc)) = ''.

    Dejando únicamente el JSON (desde la primer {, hasta la última }) debería leerlo correctamente.

  • David, gracias por tú respuesta!!

    Te aseguro que es eso porque al eliminarlo READ-JSON funciona.

    El 0 luego de la última } también lo elimino previamente junto con todo el encabezado.

  • Momento... ¿READ-JSON de una TT?¿o READ-JSON de un objeto JSON?

    Si es de una TT/Dataset, sin duda va a fallar y es razonable que lo haga, porque no hay "dónde meter" esos atributos.

    Si es de un JSON-X (no lo uso, por lo que no se bien cuál es el nombre), no debería fallar y deberías verlo con soporte técnico de Progress (asumiendo que tenés una licencia con soporte vigente, sino no te van a dar ni bola).

    Si estás tratando de usar eso para una TT, no te queda otra que eliminar esos atributos "extra". Si la estructura del JSON es siempre la misma, lo más simple es:

    SUBSTRING(jsonlc,R-INDEX(']',jsonlc) + 1, LENGTH(jsonlc)) = '~}'.

  • David, la verdad que la idea es igualar el Json a una TT, por eso da el error.

    Con JSON-X, no se a que te referís, la verdad que no me tope con eso en ningún lado (manual, web).

    De cualquier manera las sentencias que me pasaste me vinieron muy bien, ya que a progress lo toco una vez cada tanto (soy multiuso, hago de programador, de DBA, de técnico de pc, técnico de redes, programador de .net, javascript, http, etc), y estaba haciendo el proceso de otra manera más engorrosa.

    Te agradezco por la luz que me tiraste, pero para dejar todo bien cerrado, en las 3 sentencias que me pusiste hay que corregir en la parte que hace uso de INDEX, ya que primero va el jsonlc y luego el caracter a buscar.

    Forma correctaa

    SUBSTRING(jsonlc,1,INDEX(jsonlc,'~{') - 1) = ''.

    SUBSTRING(jsonlc,R-INDEX(jsonlc,'~}') + 1, LENGTH(jsonlc)) = ''.

    SUBSTRING(jsonlc,R-INDEX(jsonlc,']') + 1, LENGTH(jsonlc)) = '~}

  • Cierto, gracias por la aclaración. Siempre confundo el orden en INDEX (es el problema de trabajar con múltiples lenguajes).

    Por JSON-X me refiero a que hay un componente similar al SAX-READEAR / SAX-WRITER para trabajar con JSON. Creo que es más parecido a un DOM, en el sentido de que te arma toda la jerarquía de elementos.

    No tengo idea en qué verisión de Progress se introdujo, ni cuál es realmente el nombre, ni cómo se usa, por eso JSON-X.