jacobwilliams / json-fortran

A Modern Fortran JSON API
https://jacobwilliams.github.io/json-fortran/
Other
337 stars 86 forks source link

Add_by_path_otherways supports? #578

Open LaplaceSoda opened 2 months ago

LaplaceSoda commented 2 months ago

It seems that the subroutine add_by_path only support the default way to specify the path (path_mode=1), actually the following codes does not work

program main
    use json_module
    implicit none
    type(json_file) :: new_json
    new_json = add_test()
    call new_json%print()
contains
    function add_test() result(json)
        type(json_file) :: json

        call json%initialize(path_mode=2)
        call json%add('/aaa', 123)
        call json%print()
    end function add_test
end program main

I wonder if this module can deal with the add_by_path with path_mode=2(or3) normally. If not, will there be an update to support it ?

jacobwilliams commented 2 months ago

According to my comments:

!  It only works for `path_mode=1` or `path_mode=3`.
!  An error will be thrown for `path_mode=2` (RFC 6901).

And this note about path_mode=2:

            if (json%path_mode==2_IK) then
                ! the problem here is there isn't really a way to disambiguate
                ! the array elements, so '/a/0' could be 'a(1)' or 'a.0'.

So I guess it's not really possible? If anyone has a solution for this I would be interested to hear it.

jacobwilliams commented 2 months ago

The assumption could be made that numbers are always treated as array elements.

LaplaceSoda commented 2 months ago

In my opinion, the add functions are just the reverse process of the get functions. So theoretically, if get can correctly recognize the path, then add should also recognize the path correctly.

LaplaceSoda commented 2 months ago

The assumption could be made that numbers are always treated as array elements.

Maybe adding an optional flag argument to the add function which is only of use when there is /[\d+] in path and then letting developer choose the meaning of /[int] themselves would deal with this problem ?