vespina / json

100% VFP JSON parser & utilities
GNU General Public License v3.0
18 stars 6 forks source link

Add JS item method for allow indexation from VFP in fastparsermode #2

Closed voxsoftware closed 1 year ago

voxsoftware commented 1 year ago

This allow get non-valid properties from VFP, or access easy to any array from VFP.

Example:

result = JSON.parse("[1, "Prueba", {"a": 1}]")
?m.result.item[0]
?m.result.item[1]
?m.result.item[2]
vespina commented 1 year ago

Thanks!

voxsoftware commented 1 year ago

Ahorita lo que me preocupa es que si el JSON incluye una propiedad item, entonces el método item se oculta (en arrays obviamente esto no pasaría). Así que no sé si sería bueno añadir adicionalmente el mismo método item que acabo de poner con otro nombre más único, tal vez __item para en casos donde el método item esté oculto, y haya que acceder a propiedades raras como ejemplo propiedades con espacio o caracteres no válidos en VFP.

Me explico ejemplo:

JSON.parse('{"item": {"count": 1}, "$order": 1}')

* mostraría objeto 
?m.result.item 
* mostraría 1
?m.result.item .count
* syntax error
?m.result.$order
* error porque el método item quedaría oculto en este ejemplo
?m.result.item["$order"]

El escenario anterior podría solucionarse añadiendo un método más que funcione exactamente igual pero con un nombre menos común como __item

JSON.parse('{"item": {"count": 1}, "$order": 1}')

* mostraría: 1
?m.result.__item["$order"]

¿Qué opina?

vespina commented 1 year ago

Por eso decia en el grupo que la mejor solucion en mi opinion es normalizar los resultados, de modo que aun usando el fastParsing, el resultado sea un objeto fox, usando colecciones para los arrays. Estamos claros que hay casos de casos, y no es el objetivo de esta libreria ser capaz de manejar CUALQUIER string JSON, sobre todo los generados desde JS, sino que funcione con los casos de uso mas comunes en escenarios reales (intercambio de datos entre nuestro codigo fox y un backend REST).

voxsoftware commented 1 year ago

@vespina Pero si solo importa los array, con mi solución no hay ningún inconveniente. En los array se puede usar el método item actualmente sin ninguna desventaja. Lo que yo expuse es para objetos, así que si tu interés es solo por array, como mandé el pull funciona sin problemas.

De todos modos después de analizar pros y contras, encontré una mejor solución para el caso de objetos. Te haré otro pull request.

Puedo hacer que el método item tenga mayor relevancia que una propiedad item. De ese modo el método siempre está disponible, y no se oculta bajo ningún caso, aún cuando se parsea un objeto que tenga la propiedad item. Si en un código específico se necesita acceder a una propiedad item, entonces se necesitaría usar el método item:

result = JSON.parse('{"item": {"count": 1}, "nums":[1000,2000],"$order": 1}')

* acceder a la propiedad item
?m.result.item["item"]

* mostraría 1
?m.result.item["item"].count 

* acceder a propiedades no válidas en VFP
?m.result.item["$order"]

* los arrays se pueden acceder también con item (mostraría 1000)
?m.result.nums.item[0]
voxsoftware commented 1 year ago

y adicional a mi comentario anterior, yo pienso que añadir la lógica de crear objetos directamente en VFP, quitaría los beneficios de rendimiento, por eso estoy haciendo el código para resolverlo directamente desde código javascript. De todas formas si prefiere puede poner eso como un parámetro adicional, si el usuario desea usar el creador de objetos nativos.