json_matrix_info Subroutine

private subroutine json_matrix_info(json, p, is_matrix, var_type, n_sets, set_size, name)

Alternate version of json_info that returns matrix information about a json_value.

A json_value is a valid rank 2 matrix if all of the following are true:

  • The var_type is json_array
  • Each child is also a json_array, each of which has the same number of elements
  • Each individual element has the same variable type (integer, logical, etc.)

The idea here is that if it is a valid matrix, it can be interoperable with a Fortran rank 2 array of the same type.

Example

The following example is an array with var_type=json_integer, n_sets=3, and set_size=4

    {
        "matrix": [
            [1,2,3,4],
            [5,6,7,8],
            [9,10,11,12]
        ]
    }

Type Bound

json_core

Arguments

Type IntentOptional Attributes Name
class(json_core), intent(inout) :: json
type(json_value), pointer :: p

a JSON linked list

logical(kind=LK), intent(out) :: is_matrix

true if it is a valid matrix

integer(kind=IK), intent(out), optional :: var_type

variable type of data in the matrix (if all elements have the same type)

integer(kind=IK), intent(out), optional :: n_sets

number of data sets (i.e., matrix rows if using row-major order)

integer(kind=IK), intent(out), optional :: set_size

size of each data set (i.e., matrix cols if using row-major order)

character(kind=CK, len=:), intent(out), optional, allocatable :: name

variable name


Calls

proc~~json_matrix_info~~CallsGraph proc~json_matrix_info json_core%json_matrix_info none~get_child json_core%get_child proc~json_matrix_info->none~get_child none~info~2 json_core%info proc~json_matrix_info->none~info~2 none~throw_exception json_core%throw_exception proc~json_matrix_info->none~throw_exception proc~json_value_get_child json_core%json_value_get_child none~get_child->proc~json_value_get_child proc~json_value_get_child_by_index json_core%json_value_get_child_by_index none~get_child->proc~json_value_get_child_by_index proc~json_value_get_child_by_name json_core%json_value_get_child_by_name none~get_child->proc~json_value_get_child_by_name proc~json_info json_core%json_info none~info~2->proc~json_info proc~json_info_by_path json_core%json_info_by_path none~info~2->proc~json_info_by_path proc~json_throw_exception json_core%json_throw_exception none~throw_exception->proc~json_throw_exception proc~json_info->none~throw_exception proc~json_info_by_path->none~info~2 none~get~2 json_core%get proc~json_info_by_path->none~get~2 proc~json_value_get_child->none~throw_exception proc~json_value_get_child_by_index->none~throw_exception proc~json_clear_exceptions json_core%json_clear_exceptions proc~json_value_get_child_by_index->proc~json_clear_exceptions proc~json_value_get_child_by_name->none~throw_exception proc~json_value_get_child_by_name->proc~json_clear_exceptions proc~name_equal json_core%name_equal proc~json_value_get_child_by_name->proc~name_equal proc~json_get_alloc_string_vec json_core%json_get_alloc_string_vec none~get~2->proc~json_get_alloc_string_vec proc~json_get_alloc_string_vec_by_path json_core%json_get_alloc_string_vec_by_path none~get~2->proc~json_get_alloc_string_vec_by_path proc~json_get_array json_core%json_get_array none~get~2->proc~json_get_array proc~json_get_array_by_path json_core%json_get_array_by_path none~get~2->proc~json_get_array_by_path proc~json_get_by_path json_core%json_get_by_path none~get~2->proc~json_get_by_path proc~json_get_integer json_core%json_get_integer none~get~2->proc~json_get_integer proc~json_get_integer_by_path json_core%json_get_integer_by_path none~get~2->proc~json_get_integer_by_path proc~json_get_integer_vec json_core%json_get_integer_vec none~get~2->proc~json_get_integer_vec proc~json_get_integer_vec_by_path json_core%json_get_integer_vec_by_path none~get~2->proc~json_get_integer_vec_by_path proc~json_get_logical json_core%json_get_logical none~get~2->proc~json_get_logical proc~json_get_logical_by_path json_core%json_get_logical_by_path none~get~2->proc~json_get_logical_by_path proc~json_get_logical_vec json_core%json_get_logical_vec none~get~2->proc~json_get_logical_vec proc~json_get_logical_vec_by_path json_core%json_get_logical_vec_by_path none~get~2->proc~json_get_logical_vec_by_path proc~json_get_real json_core%json_get_real none~get~2->proc~json_get_real proc~json_get_real32 json_core%json_get_real32 none~get~2->proc~json_get_real32 proc~json_get_real32_by_path json_core%json_get_real32_by_path none~get~2->proc~json_get_real32_by_path proc~json_get_real32_vec json_core%json_get_real32_vec none~get~2->proc~json_get_real32_vec proc~json_get_real32_vec_by_path json_core%json_get_real32_vec_by_path none~get~2->proc~json_get_real32_vec_by_path proc~json_get_real_by_path json_core%json_get_real_by_path none~get~2->proc~json_get_real_by_path proc~json_get_real_vec json_core%json_get_real_vec none~get~2->proc~json_get_real_vec proc~json_get_real_vec_by_path json_core%json_get_real_vec_by_path none~get~2->proc~json_get_real_vec_by_path proc~json_get_string json_core%json_get_string none~get~2->proc~json_get_string proc~json_get_string_by_path json_core%json_get_string_by_path none~get~2->proc~json_get_string_by_path proc~json_get_string_vec json_core%json_get_string_vec none~get~2->proc~json_get_string_vec proc~json_get_string_vec_by_path json_core%json_get_string_vec_by_path none~get~2->proc~json_get_string_vec_by_path proc~name_strings_equal json_core%name_strings_equal proc~name_equal->proc~name_strings_equal proc~json_get_alloc_string_vec->none~get~2 none~string_info json_core%string_info proc~json_get_alloc_string_vec->none~string_info proc~json_get_alloc_string_vec_by_path->none~throw_exception proc~json_get_alloc_string_vec_by_path->none~get~2 proc~json_get_alloc_string_vec_by_path->proc~json_clear_exceptions proc~flag_not_found flag_not_found proc~json_get_alloc_string_vec_by_path->proc~flag_not_found proc~json_get_array->none~throw_exception proc~json_get_array_by_path->none~throw_exception proc~json_get_array_by_path->none~get~2 proc~json_get_array_by_path->proc~json_clear_exceptions proc~json_get_by_path->none~throw_exception proc~json_get_by_path->proc~json_clear_exceptions proc~integer_to_string integer_to_string proc~json_get_by_path->proc~integer_to_string proc~json_get_by_path_default json_core%json_get_by_path_default proc~json_get_by_path->proc~json_get_by_path_default proc~json_get_by_path_jsonpath_bracket json_core%json_get_by_path_jsonpath_bracket proc~json_get_by_path->proc~json_get_by_path_jsonpath_bracket proc~json_get_by_path_rfc6901 json_core%json_get_by_path_rfc6901 proc~json_get_by_path->proc~json_get_by_path_rfc6901 proc~json_get_integer->none~throw_exception proc~string_to_integer string_to_integer proc~json_get_integer->proc~string_to_integer proc~json_get_integer_by_path->none~throw_exception proc~json_get_integer_by_path->none~get~2 proc~json_get_integer_by_path->proc~json_clear_exceptions proc~json_get_integer_by_path->proc~flag_not_found proc~json_get_integer_vec->none~get~2 proc~json_get_integer_vec_by_path->none~throw_exception proc~json_get_integer_vec_by_path->none~get~2 proc~json_get_integer_vec_by_path->proc~json_clear_exceptions proc~json_get_integer_vec_by_path->proc~flag_not_found proc~json_get_logical->none~throw_exception proc~json_get_logical_by_path->none~throw_exception proc~json_get_logical_by_path->none~get~2 proc~json_get_logical_by_path->proc~json_clear_exceptions proc~json_get_logical_by_path->proc~flag_not_found proc~json_get_logical_vec->none~get~2 proc~json_get_logical_vec_by_path->none~throw_exception proc~json_get_logical_vec_by_path->none~get~2 proc~json_get_logical_vec_by_path->proc~json_clear_exceptions proc~json_get_logical_vec_by_path->proc~flag_not_found proc~json_get_real->none~throw_exception proc~string_to_real string_to_real proc~json_get_real->proc~string_to_real proc~json_get_real32->none~get~2 proc~json_get_real32_by_path->none~get~2 proc~json_get_real32_vec->none~get~2 proc~json_get_real32_vec_by_path->none~get~2 proc~json_get_real_by_path->none~throw_exception proc~json_get_real_by_path->none~get~2 proc~json_get_real_by_path->proc~json_clear_exceptions proc~json_get_real_by_path->proc~flag_not_found proc~json_get_real_vec->none~get~2 proc~json_get_real_vec_by_path->none~throw_exception proc~json_get_real_vec_by_path->none~get~2 proc~json_get_real_vec_by_path->proc~json_clear_exceptions proc~json_get_real_vec_by_path->proc~flag_not_found proc~json_get_string->none~throw_exception proc~escape_string escape_string proc~json_get_string->proc~escape_string proc~json_get_string->proc~integer_to_string proc~real_to_string real_to_string proc~json_get_string->proc~real_to_string proc~json_get_string_by_path->none~throw_exception proc~json_get_string_by_path->none~get~2 proc~json_get_string_by_path->proc~json_clear_exceptions proc~json_get_string_by_path->proc~flag_not_found proc~json_get_string_vec->none~get~2 proc~json_get_string_vec_by_path->none~throw_exception proc~json_get_string_vec_by_path->none~get~2 proc~json_get_string_vec_by_path->proc~json_clear_exceptions proc~json_get_string_vec_by_path->proc~flag_not_found proc~lowercase_string lowercase_string proc~name_strings_equal->proc~lowercase_string proc~json_string_info json_core%json_string_info none~string_info->proc~json_string_info proc~valid_json_hex valid_json_hex proc~escape_string->proc~valid_json_hex proc~json_get_by_path_default->none~get_child proc~json_get_by_path_default->none~throw_exception proc~json_get_by_path_default->proc~json_clear_exceptions proc~json_get_by_path_default->proc~string_to_integer none~add~2 json_core%add proc~json_get_by_path_default->none~add~2 proc~json_value_create json_value_create proc~json_get_by_path_default->proc~json_value_create proc~to_array json_core%to_array proc~json_get_by_path_default->proc~to_array proc~to_null json_core%to_null proc~json_get_by_path_default->proc~to_null proc~to_object json_core%to_object proc~json_get_by_path_default->proc~to_object proc~json_get_by_path_jsonpath_bracket->none~get_child proc~json_get_by_path_jsonpath_bracket->none~throw_exception proc~json_get_by_path_jsonpath_bracket->proc~json_clear_exceptions proc~json_get_by_path_jsonpath_bracket->proc~string_to_integer proc~json_get_by_path_jsonpath_bracket->none~add~2 proc~convert json_core%convert proc~json_get_by_path_jsonpath_bracket->proc~convert proc~json_get_by_path_jsonpath_bracket->proc~json_value_create proc~json_get_by_path_jsonpath_bracket->proc~to_null proc~json_get_by_path_rfc6901->none~get_child proc~json_get_by_path_rfc6901->none~throw_exception proc~json_get_by_path_rfc6901->proc~json_clear_exceptions proc~json_get_by_path_rfc6901->proc~string_to_integer proc~decode_rfc6901 decode_rfc6901 proc~json_get_by_path_rfc6901->proc~decode_rfc6901 proc~compact_real_string compact_real_string proc~real_to_string->proc~compact_real_string proc~json_value_add_integer json_core%json_value_add_integer none~add~2->proc~json_value_add_integer proc~json_value_add_integer_vec json_core%json_value_add_integer_vec none~add~2->proc~json_value_add_integer_vec proc~json_value_add_logical json_core%json_value_add_logical none~add~2->proc~json_value_add_logical proc~json_value_add_logical_vec json_core%json_value_add_logical_vec none~add~2->proc~json_value_add_logical_vec proc~json_value_add_member json_core%json_value_add_member none~add~2->proc~json_value_add_member proc~json_value_add_null json_core%json_value_add_null none~add~2->proc~json_value_add_null proc~json_value_add_real json_core%json_value_add_real none~add~2->proc~json_value_add_real proc~json_value_add_real32 json_core%json_value_add_real32 none~add~2->proc~json_value_add_real32 proc~json_value_add_real32_vec json_core%json_value_add_real32_vec none~add~2->proc~json_value_add_real32_vec proc~json_value_add_real_vec json_core%json_value_add_real_vec none~add~2->proc~json_value_add_real_vec proc~json_value_add_string json_core%json_value_add_string none~add~2->proc~json_value_add_string proc~json_value_add_string_vec json_core%json_value_add_string_vec none~add~2->proc~json_value_add_string_vec proc~convert->none~info~2 proc~convert->none~throw_exception none~create_array json_core%create_array proc~convert->none~create_array none~create_null json_core%create_null proc~convert->none~create_null none~create_object json_core%create_object proc~convert->none~create_object proc~json_value_replace json_core%json_value_replace proc~convert->proc~json_value_replace proc~replace_string replace_string proc~decode_rfc6901->proc~replace_string proc~json_string_info->none~info~2 proc~json_string_info->none~throw_exception proc~json_string_info->none~get~2 proc~json_string_info->proc~json_clear_exceptions proc~destroy_json_data destroy_json_data proc~to_array->proc~destroy_json_data proc~to_null->proc~destroy_json_data proc~to_object->proc~destroy_json_data proc~json_value_create_array json_core%json_value_create_array none~create_array->proc~json_value_create_array proc~json_value_create_null json_core%json_value_create_null none~create_null->proc~json_value_create_null proc~json_value_create_object json_core%json_value_create_object none~create_object->proc~json_value_create_object proc~json_value_add_integer->none~add~2 none~create_integer json_core%create_integer proc~json_value_add_integer->none~create_integer proc~json_value_add_integer_vec->none~add~2 proc~json_value_add_integer_vec->none~create_array proc~json_value_add_logical->none~add~2 none~create_logical json_core%create_logical proc~json_value_add_logical->none~create_logical proc~json_value_add_logical_vec->none~add~2 proc~json_value_add_logical_vec->none~create_array proc~json_value_add_member->none~info~2 proc~json_value_add_member->none~throw_exception proc~json_value_add_null->none~add~2 proc~json_value_add_null->none~create_null proc~json_value_add_real->none~add~2 none~create_real~2 json_core%create_real proc~json_value_add_real->none~create_real~2 proc~json_value_add_real32->none~add~2 proc~json_value_add_real32_vec->none~add~2 proc~json_value_add_real_vec->none~add~2 proc~json_value_add_real_vec->none~create_array proc~json_value_add_string->none~add~2 none~create_string json_core%create_string proc~json_value_add_string->none~create_string proc~json_value_add_string_vec->none~add~2 proc~json_value_add_string_vec->none~create_array none~insert_after json_core%insert_after proc~json_value_replace->none~insert_after proc~json_value_remove json_core%json_value_remove proc~json_value_replace->proc~json_value_remove proc~json_value_create_integer json_core%json_value_create_integer none~create_integer->proc~json_value_create_integer proc~json_value_create_logical json_core%json_value_create_logical none~create_logical->proc~json_value_create_logical proc~json_value_create_real32 json_core%json_value_create_real32 none~create_real~2->proc~json_value_create_real32 proc~json_value_create_string json_core%json_value_create_string none~create_string->proc~json_value_create_string proc~json_value_insert_after json_core%json_value_insert_after none~insert_after->proc~json_value_insert_after proc~json_value_insert_after_child_by_index json_core%json_value_insert_after_child_by_index none~insert_after->proc~json_value_insert_after_child_by_index proc~json_value_create_array->proc~json_value_create proc~json_value_create_array->proc~to_array proc~json_value_create_null->proc~json_value_create proc~json_value_create_null->proc~to_null proc~json_value_create_object->proc~json_value_create proc~json_value_create_object->proc~to_object none~destroy~3 json_core%destroy proc~json_value_remove->none~destroy~3 proc~destroy_json_core json_core%destroy_json_core none~destroy~3->proc~destroy_json_core proc~json_value_destroy json_core%json_value_destroy none~destroy~3->proc~json_value_destroy proc~json_value_create_integer->proc~json_value_create proc~to_integer json_core%to_integer proc~json_value_create_integer->proc~to_integer proc~json_value_create_logical->proc~json_value_create proc~to_logical json_core%to_logical proc~json_value_create_logical->proc~to_logical proc~json_value_create_real32->none~create_real~2 proc~json_value_create_string->proc~json_value_create proc~to_string json_core%to_string proc~json_value_create_string->proc~to_string proc~json_value_insert_after_child_by_index->none~get_child proc~json_value_insert_after_child_by_index->none~insert_after proc~json_value_destroy->proc~destroy_json_data proc~json_value_destroy->none~destroy~3 proc~to_integer->proc~destroy_json_data proc~to_logical->proc~destroy_json_data proc~to_string->proc~destroy_json_data

Called by

proc~~json_matrix_info~~CalledByGraph proc~json_matrix_info json_core%json_matrix_info none~matrix_info~2 json_core%matrix_info none~matrix_info~2->proc~json_matrix_info proc~json_matrix_info_by_path json_core%json_matrix_info_by_path none~matrix_info~2->proc~json_matrix_info_by_path proc~json_file_variable_matrix_info json_file%json_file_variable_matrix_info proc~json_file_variable_matrix_info->none~matrix_info~2 proc~json_matrix_info_by_path->none~matrix_info~2 proc~wrap_json_matrix_info_by_path wrap_json_matrix_info_by_path proc~wrap_json_matrix_info_by_path->none~matrix_info~2 none~matrix_info json_file%matrix_info none~matrix_info->proc~json_file_variable_matrix_info proc~wrap_json_file_variable_matrix_info wrap_json_file_variable_matrix_info proc~wrap_json_file_variable_matrix_info->none~matrix_info

Source Code

    subroutine json_matrix_info(json,p,is_matrix,var_type,n_sets,set_size,name)

    implicit none

    class(json_core),intent(inout)   :: json
    type(json_value),pointer         :: p          !! a JSON linked list
    logical(LK),intent(out)          :: is_matrix  !! true if it is a valid matrix
    integer(IK),intent(out),optional :: var_type   !! variable type of data in the matrix
                                                   !! (if all elements have the same type)
    integer(IK),intent(out),optional :: n_sets     !! number of data sets (i.e., matrix
                                                   !! rows if using row-major order)
    integer(IK),intent(out),optional :: set_size   !! size of each data set (i.e., matrix
                                                   !! cols if using row-major order)
    character(kind=CK,len=:),allocatable,intent(out),optional :: name !! variable name

    type(json_value),pointer :: p_row       !! for getting a set
    type(json_value),pointer :: p_element   !! for getting an element in a set
    integer(IK) :: vartype         !! json variable type of `p`
    integer(IK) :: row_vartype     !! json variable type of a row
    integer(IK) :: element_vartype !! json variable type of an element in a row
    integer(IK) :: nr              !! number of children of `p`
    integer(IK) :: nc              !! number of elements in first child of `p`
    integer(IK) :: icount          !! number of elements in a set
    integer(IK) :: i               !! counter
    integer(IK) :: j               !! counter
#if defined __GFORTRAN__
    character(kind=CK,len=:),allocatable :: p_name  !! temporary variable for getting name
#endif

    !get info about the variable:
#if defined __GFORTRAN__
    call json%info(p,vartype,nr)
    if (present(name)) then !workaround for gfortran bug
        if (allocated(p%name)) then
            p_name = p%name
            name = p_name
        else
            name = CK_''
        end if
    end if
#else
    call json%info(p,vartype,nr,name)
#endif

    is_matrix = (vartype==json_array)

    if (is_matrix) then

        main : do i=1,nr

            nullify(p_row)
            call json%get_child(p,i,p_row)
            if (.not. associated(p_row)) then
                is_matrix = .false.
                call json%throw_exception('Error in json_matrix_info: '//&
                                          'Malformed JSON linked list')
                exit main
            end if
            call json%info(p_row,var_type=row_vartype,n_children=icount)

            if (row_vartype==json_array) then
                if (i==1) nc = icount  !number of columns in first row
                if (icount==nc) then   !make sure each row has the same number of columns
                    !see if all the variables in this row are the same type:
                    do j=1,icount
                        nullify(p_element)
                        call json%get_child(p_row,j,p_element)
                        if (.not. associated(p_element)) then
                            is_matrix = .false.
                            call json%throw_exception('Error in json_matrix_info: '//&
                                                      'Malformed JSON linked list')
                            exit main
                        end if
                        call json%info(p_element,var_type=element_vartype)
                        if (i==1 .and. j==1) vartype = element_vartype  !type of first element
                                                                        !in the row
                        if (vartype/=element_vartype) then
                            !not all variables are the same time
                            is_matrix = .false.
                            exit main
                        end if
                    end do
                else
                    is_matrix = .false.
                    exit main
                end if
            else
                is_matrix = .false.
                exit main
            end if

        end do main

    end if

    if (is_matrix) then
        if (present(var_type)) var_type = vartype
        if (present(n_sets))   n_sets   = nr
        if (present(set_size)) set_size = nc
    else
        if (present(var_type)) var_type = json_unknown
        if (present(n_sets))   n_sets   = 0
        if (present(set_size)) set_size = 0
    end if

    end subroutine json_matrix_info