Iniciar Sesión

Ver la Versión Completa : [Sintaxis] Leer dato en un archivo Json con Chilkat...


Fito
2 de mayo de 2023, 22:52
Hola Amigos:

Acá les paso una parte de un archivo json (no está completo, le deben faltar cerrar estructuras).


{
"success": true,
"numberOfItems": 1000,
"data": [{
"c": {
"visit": null,
"dLine": null,
"ivr": null,
"dk": null,
"eg": null,
"p": {
"01": {
"k": "01",
"n": "",
"p": ""
}
},
"rk": "414338",
"pl": "0001",
"tc": null,
"sc": null,
"fn": null,
"t": null,
"n": "AUTOSERVICIO EL GRINGO",
"rc": null,
"ta": null,
"bn": "AUTOSERVICIO EL GRINGO",
"su": null,
"it": "DNI",
"e": null,
"f": null,
"b": null,
"s": {
"0025": true
},
"freq": null,
"or": null,
"de": null,
"i": null,
"a": {
"01": {
"a": "LEARTE 518 ESQ ALBERTI",
"k": "01",
"n": "CORDOBA",
"s": "Cordoba",
"z": "5000"
}
},
"k": "414338"
},
"py": {
"a01": {
"m": 0,
"a": "4179.75",
"t": 1672662427727,
"k": "a01"
}
},
"impdoc": {
"0001701000100225728X": {
"createdAt": 1672504338523,
"dc": "FC",
"da": 4180,
"rk": "0001701000100225728X ",
"saldo": 4179.75,
"te": 1672747200000,
"s": "0025",
"q": {
"01": {
"k": "01",
"ia": 4179.75,
"pa": 0,
"qn": "01",
"te": 1672747200000,
"selected": true,
"py": 4179.75
}
},
"tc": 1672142400000,
"bn": "AUTOSERVICIO EL GRINGO",
"do": "0001",
"updatedAt": 1672504338523,
"k": "0001701000100225728X",
"cn": "AUTOSERVICIO EL GRINGO",
"c": "414338",
"co": null,
"url": null,
"dt": "FC",
"dn": "00225728",
"mo": "2",
"k2": null,
"dd": null,
"st": {}
}
},
"p": {
"c": {
"la": -31.415711666666667,
"lo": -64.136835
},
"m": false
},
"envId": "eE8Hj9Ob1p",
"st": 0,
"fk": "00251672662427727",
"l": "1342",
"ta": "4179.75",
"ap": null,
"r": "null",
"s": "0025",
"t": 1672662427727,
"sk": "0025230002092707",
"createdAt": "2023-01-02T12:27:05.315Z",
"updatedAt": "2023-01-02T12:27:05.315Z"
}


Si buscan el campo "impdoc" van a ver que adentro hay un abjeto "0001701000100225728X" este objeto es variable, no siempre se llama igual y no logro cómo puedo leerlo para poder dirigirme a los datos que hay dentro. Si pongo ese valor funciona, pero ese valor no lo sé, porque se compone de datos de un comprobante. En síntesis tengo que lograr leer el dato "impdoc" y poder saber qué tiene adentro.

No sé si me expliqué bien. Cualquier cosa me preguntan.

Para leer los json estoy usando el activex de chilkat. En este foro hay unos ejemplos, pero ninguno tiene la estructura esta.

Saludos

Fito...

JCantero
2 de mayo de 2023, 23:41
@Fito, si no entiendo mal dices que dentro de "impdoc" hay un subJson cada vez diferente a "0001701000100225728X" y supongo que dentro de este subJson (cada vez diferente) las etiquetas si serán ya iguales.

Yo en cobol no utilizo Json pero si en C# y yo haria esto:

1) cogería el contenido de "impdoc"
2) podria leer la primera etiqueta que en este caso es "0001701000100225728X"
3) deserializaría el contenido en una clase (que supongo que sera siempre sería igual)

En cobol ( como no tengo utilizades para acceder)

1) cogería el contenido de "impdoc"
2) cambiaria la descripción de la etiqueta "0001701000100225728X" por una fija. (guardando este contenido si hay que utilizarlo)
3) y trataría el json

No se si esto te sirve.

A ver si algún forero tiene otra idea mas adecuada.
:astro:

Fito
4 de mayo de 2023, 21:52
Hola @JCantero,

El tema es que no sé cómo leer esa etiqueta, porque con la etiqueta leo el contenido, pero la etiqueta en si, no.

No quería recurrir al windev para esto, quería tenerlo todo en cobol. Pero me parece que no me va a quedar otra si lo quiero resolver rápido.

Saludos.

Fito...

JCantero
5 de mayo de 2023, 10:08
@Fito, el contenido de "impdoc" lo puedes coger perfectamente.

Una vez tengas ese contenido ( en un string por ejemplo ) analiza la etiqueta variable y el resto.

Pasa el resto a tu proceso como un Json y creo que lo tienes resuelto.

fastpho
5 de mayo de 2023, 14:18
Hola @Fito te paso un ejemplo como recorrer los miembros inmediatos de un objeto JSON.
Con el metodo NameAt , obtenemos el nombre del miembro N
Con el metodo StringAt, devuelve el valor de cadena del miembro N

WORKING-STORAGE SECTION.
01 ReturnValue PIC s9(9) comp-5.
01 I PIC 99.
01 lSIZE pic s9(9) comp-5.
01 txtNAME PIC X(50).
01 txtValue PIC X(1024).
PROCEDURE DIVISION.
INVOKE ChilkatJsonObject2 "LoadFile" USING "JSON.txt" RETURNING ReturnValue.
display "ReturnValue : " , ReturnValue.

MOVE "Size" OF ChilkatJsonObject2 TO lSIZE.
display "lSIZE : " , lSIZE.
MOVE 0 TO I.
PERFORM VARYING I FROM 0 BY 1 UNTIL I = lSIZE
DISPLAY "I: " , I
INVOKE ChilkatJsonObject2 "NameAt" USING I RETURNING txtNAME
DISPLAY "NAME : " , txtNAME
INVOKE ChilkatJsonObject2 "StringAt" USING I RETURNING txtValue
DISPLAY "VALUE : " , txtvalue
END-PERFORM.


Espero te sirva
Saludos ...

Fito
11 de agosto de 2023, 16:14
Hola:

Saben si existe algún método para verificar si determinado campo existe en el archivo Json? Porque me da error de tipo de dato,

Saludos

Fito...

fastpho
14 de agosto de 2023, 16:33
Hola @Fito : probaste con el metodo FindRecordString
te paso un link : https://www.chilkatsoft.com/refdoc/xChilkatJsonObjectRef.html#method35
ejemplo en vb : https://www.example-code.com/vb6/json_find_record_string.asp

Saludos ...

pd: pudiste resolver (Si buscan el campo "impdoc" van a ver que adentro hay un objeto "0001701000100225728X" este objeto es variable) ?

Fito
14 de agosto de 2023, 16:38
Hola @fastpho,

Ese proyecto lo tengo en el freezer, no seguí por ahora. Voy a ver si con ese método soluciono lo otro,

Gracias

Saludos

Fito...

fastpho
14 de agosto de 2023, 16:49
@Fito, podes probar con ChilkatStringBuilder . con el metodo
GetAfterBetween

move 'impdoc' to searchAfter(1:6).
move '{' to beginMark(1:1)
move ':' to endMark(1:1)
INVOKE ChilkatStringBuilder1 "GetAfterBetween" USING searchAfter beginMark endMark
Saludos...

Fito
26 de septiembre de 2023, 21:54
Hola @fastpho,

Estoy retomando este proyecto. Ahí logré hacer lo que quería, pero tuve que trabajar con COM. Porque necesité generar un objeto desde otro objeto para poder usar el "NameAt".

Anduvo bien. Muchas Gracias.

Saludos

Fito...

Fito
6 de agosto de 2024, 21:11
Hola Amigos:

Sigo usando Chillkat para leer los json y funciona perfecto. El único incoveniente es que debo setear la configuración regional en punto decimal, en vez de coma.

Habrá algun ocx que haga lo mismo que chillkat, pero que pueda usar coma decimal.

Saludos

Fito...

Kuk
6 de agosto de 2024, 22:39
@Fito, y por qué no usas variables temporales editados, o un chanchullo tipo usar variables alfa con un INSPECT CONVERTING, o intentar a lo mejor quitar DECIMAL POINT IS COMMA en la rutina donde tratas con la OCX? Así no tendrás que jugar con la configuración regional, todo queda en puro Cobol.

JCantero
7 de agosto de 2024, 19:20
@Fito, Lo mejor es lo que te apunta @Kuk y la mejor opción es quitar el "decimal point" en la rutina donde trates el JSON.

No conozco ese OCX pero en el estandar de JSON los numero van con ".", si fueran con "," seria final de campo.