json_file Derived Type

type, public :: json_file

The json_file is the main public class that is used to open a file and get data from it.

A json_file contains only two items: an instance of a json_core, which use used for all data manipulation, and a json_value, which is used to construct the linked-list data structure. Note that most methods in the json_file class are simply wrappers to the lower-level routines in the json_value_module.

Example

    program test
    use json_module
    implicit none
    type(json_file) :: json
    integer :: ival
    real(real64) :: rval
    character(len=:),allocatable :: cval
    logical :: found
    call json%initialize(compact_reals=.true.)
    call json%load_file(filename='myfile.json')
    call json%print_file() !print to the console
    call json%get('var.i',ival,found)
    call json%get('var.r(3)',rval,found)
    call json%get('var.c',cval,found)
    call json%destroy()
    end program test

Inherits

type~~json_file~~InheritsGraph type~json_file json_file type~json_value json_value type~json_file->type~json_value p type~json_core json_core type~json_file->type~json_core core type~json_value->type~json_value previous, next, parent, children, tail

Contents

Source Code


Components

TypeVisibility AttributesNameInitial
type(json_core), private :: core

The instance of the json_core factory used for this file.

type(json_value), private, pointer:: p=> null()

the JSON structure read from the file


Constructor

public interface json_file

Structure constructor to initialize a json_file object with an existing json_value object, and either the json_core settings or a json_core instance.

Read more…
  • private function initialize_json_file(p, verbose, compact_reals, print_signs, real_format, spaces_per_tab, strict_type_checking, trailing_spaces_significant, case_sensitive_keys, no_whitespace, unescape_strings, comment_char, path_mode, path_separator, compress_vectors, allow_duplicate_keys, escape_solidus, stop_on_error) result(file_object)

    Author
    Izaak Beekman
    Date
    07/23/2015

    Cast a json_value object as a json_file object. It also calls the initialize() method.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    type(json_value), intent(in), optional pointer:: p

    json_value object to cast as a json_file object

    logical(kind=LK), intent(in), optional :: verbose

    mainly useful for debugging (default is false)

    logical(kind=LK), intent(in), optional :: compact_reals

    to compact the real number strings for output (default is true)

    logical(kind=LK), intent(in), optional :: print_signs

    always print numeric sign (default is false)

    character(kind=CDK,len=*), intent(in), optional :: real_format

    Real number format: 'E' [default], '*', 'G', 'EN', or 'ES'

    integer(kind=IK), intent(in), optional :: spaces_per_tab

    number of spaces per tab for indenting (default is 2)

    logical(kind=LK), intent(in), optional :: strict_type_checking

    if true, no integer, double, or logical type conversions are done for the get routines (default is false)

    logical(kind=LK), intent(in), optional :: trailing_spaces_significant

    for name and path comparisons, is trailing space to be considered significant. (default is false)

    logical(kind=LK), intent(in), optional :: case_sensitive_keys

    for name and path comparisons, are they case sensitive. (default is true)

    logical(kind=LK), intent(in), optional :: no_whitespace

    if true, printing the JSON structure is done without adding any non-significant spaces or linebreaks (default is false)

    logical(kind=LK), intent(in), optional :: unescape_strings

    If false, then the raw escaped string is returned from json_get_string and similar routines. If true [default], then the string is returned unescaped.

    character(kind=CK,len=1), intent(in), optional :: comment_char

    If present, this character is used to denote comments in the JSON file, which will be ignored if present. Example: ! or #. Setting this to a blank string disables the ignoring of comments. (Default is !).

    integer(kind=IK), intent(in), optional :: path_mode

    How the path strings are interpreted in the get_by_path routines: * 1 – Default mode (see json_get_by_path_default) * 2 – as RFC 6901 "JSON Pointer" paths (see json_get_by_path_rfc6901) * 3 – JSONPath "bracket-notation" see json_get_by_path_jsonpath_bracket)

    character(kind=CK,len=1), intent(in), optional :: path_separator

    The path separator to use in the "default" mode for the paths in the various get_by_path routines. Example: . [default] or %. Note: if path_mode/=1 then this is ignored.

    logical(kind=LK), intent(in), optional :: compress_vectors

    If true, then arrays of integers, nulls, doubles, and logicals are printed all on one line. [Note: no_whitespace will override this option if necessary]. (Default is False).

    logical(kind=LK), intent(in), optional :: allow_duplicate_keysRead more…
    logical(kind=LK), intent(in), optional :: escape_solidusRead more…
    logical(kind=LK), intent(in), optional :: stop_on_error

    If an exception is raised, then immediately quit. (Default is False).

    Return Value type(json_file)

  • private function initialize_json_file_v2(json_value_object, json_core_object) result(file_object)

    Author
    Jacob Williams
    Date
    4/26/2016

    Cast a json_value pointer and a json_core object as a json_file object.

    Arguments

    Type IntentOptional AttributesName
    type(json_value), intent(in), pointer:: json_value_object
    type(json_core), intent(in) :: json_core_object

    Return Value type(json_file)


Type-Bound Procedures

Add a variable to a json_file, by specifying the path.

Example

  program test
  use json_module, rk=>json_rk, ik=>json_ik
  implicit none
  type(json_file) :: f
  call f%initialize()  ! specify whatever init options you want.
  call f%add('inputs.t', 0.0_rk)
  call f%add('inputs.x', [1.0_rk,2.0_rk,3.0_rk])
  call f%add('inputs.flag', .true.)
  call f%print_file()
  end program test
  • private subroutine json_file_add_object(me, path, p, found, was_created)

    Author
    Jacob Williams

    Add a json_value pointer to an object to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    type(json_value), intent(in), pointer:: p

    pointer to the variable to add

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

  • private subroutine json_file_add_integer(me, path, val, found, was_created)

    Author
    Jacob Williams

    Add an integer value to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

  • private subroutine json_file_add_double(me, path, val, found, was_created)

    Author
    Jacob Williams

    Add a real(RK) variable value to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

  • private subroutine json_file_add_logical(me, path, val, found, was_created)

    Author
    Jacob Williams

    Add a logical(LK) value to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    logical(kind=LK), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

  • private subroutine json_file_add_string(me, path, val, found, was_created, trim_str, adjustl_str)

    Author
    Jacob Williams

    Add a character string to a json file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

    logical(kind=LK), intent(in), optional :: trim_str

    if TRIM() should be called for the val

    logical(kind=LK), intent(in), optional :: adjustl_str

    if ADJUSTL() should be called for the val (note that ADJUSTL is done before TRIM)

  • private subroutine json_file_add_integer_vec(me, path, vec, found, was_created)

    Author
    Jacob Williams

    Add an integer vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

  • private subroutine json_file_add_double_vec(me, path, vec, found, was_created)

    Author
    Jacob Williams

    Add a real(RK) vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

  • private subroutine json_file_add_logical_vec(me, path, vec, found, was_created)

    Author
    Jacob Williams

    Add a logical(LK) vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    logical(kind=LK), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

  • private subroutine json_file_add_string_vec(me, path, vec, found, was_created, ilen, trim_str, adjustl_str)

    Author
    Jacob Williams

    Add a string vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

    integer(kind=IK), intent(in), optional dimension(:):: ilen

    the string lengths of each element in value. If not present, the full len(value) string is added for each element.

    logical(kind=LK), intent(in), optional :: trim_str

    if TRIM() should be called for each element

    logical(kind=LK), intent(in), optional :: adjustl_str

    if ADJUSTL() should be called for each element (note that ADJUSTL is done before TRIM)

procedure, public :: check_for_errors => json_file_check_for_errors

  • private subroutine json_file_check_for_errors(me, status_ok, error_msg)

    Retrieve error status and message from the class.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    logical(kind=LK), intent(out) :: status_ok

    true if there were no errors

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

    the error message (if there were errors)

procedure, public :: clear_exceptions => json_file_clear_exceptions

procedure, public :: destroy => json_file_destroy

  • private subroutine json_file_destroy(me, destroy_core)

    Author
    Jacob Williams

    Destroy the json_value data in a json_file. This must be done when the variable is no longer needed, or will be reused to open a different file. Otherwise a memory leak will occur.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    logical, intent(in), optional :: destroy_core

    to also destroy the json_core. default is to leave it as is.

procedure, public :: failed => json_file_failed

  • private pure function json_file_failed(me) result(failed)

    Check error status in the file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(in) :: me

    Return Value logical(kind=LK)

    will be true if there has been an error.

Get a variable from a json_file, by specifying the path.

  • private subroutine json_file_get_object(me, path, p, found)

    Author
    Jacob Williams
    Date
    2/3/2014

    Get a json_value pointer to an object from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    type(json_value), intent(out), pointer:: p

    pointer to the variable

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_integer(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get an integer value from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(out) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_double(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get a real(RK) variable value from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(out) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_logical(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get a logical(LK) value from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

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

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_string(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get a character string from a json file. The output val is an allocatable character string.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

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

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_integer_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/20/2014

    Get an integer vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(out), dimension(:), allocatable:: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_double_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/19/2014

    Get a real(RK) vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(out), dimension(:), allocatable:: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_logical_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/20/2014

    Get a logical(LK) vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    logical(kind=LK), intent(out), dimension(:), allocatable:: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_string_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/19/2014

    Get a string vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(out), dimension(:), allocatable:: vec

    value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

  • private subroutine json_file_get_alloc_string_vec(me, path, vec, ilen, found)

    Author
    Jacob Williams
    Date
    12/17/2016

    Get an (allocatable length) string vector from a JSON file. This is just a wrapper for json_get_alloc_string_vec_by_path.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=:), intent(out), dimension(:), allocatable:: vec

    value vector

    integer(kind=IK), intent(out), dimension(:), allocatable:: ilen

    the actual length of each character string in the array

    logical(kind=LK), intent(out), optional :: found
  • private subroutine json_file_get_root(me, p)

    Author
    Izaak Beekman
    Date
    7/23/2015

    Get a json_value pointer to the JSON file root.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    type(json_value), intent(out), pointer:: p

    pointer to the variable

procedure, public :: get_core => get_json_core_in_file

generic, public :: info => json_file_variable_info

  • private subroutine json_file_variable_info(me, path, found, var_type, n_children, name)

    Author
    Jacob Williams
    Date
    2/3/2014

    Returns information about a variable in a json_file.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    path to the variable

    logical(kind=LK), intent(out), optional :: found

    the variable exists in the structure

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

    variable type

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

    number of children

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

    variable name

generic, public :: initialize => initialize_json_core_in_file, set_json_core_in_file

  • private subroutine initialize_json_core_in_file(me, verbose, compact_reals, print_signs, real_format, spaces_per_tab, strict_type_checking, trailing_spaces_significant, case_sensitive_keys, no_whitespace, unescape_strings, comment_char, path_mode, path_separator, compress_vectors, allow_duplicate_keys, escape_solidus, stop_on_error)

    Initialize the json_core for this json_file. This is just a wrapper for json_initialize.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    logical(kind=LK), intent(in), optional :: verbose

    mainly useful for debugging (default is false)

    logical(kind=LK), intent(in), optional :: compact_reals

    to compact the real number strings for output (default is true)

    logical(kind=LK), intent(in), optional :: print_signs

    always print numeric sign (default is false)

    character(kind=CDK,len=*), intent(in), optional :: real_format

    Real number format: 'E' [default], '*', 'G', 'EN', or 'ES'

    integer(kind=IK), intent(in), optional :: spaces_per_tab

    number of spaces per tab for indenting (default is 2)

    logical(kind=LK), intent(in), optional :: strict_type_checking

    if true, no integer, double, or logical type conversions are done for the get routines (default is false)

    logical(kind=LK), intent(in), optional :: trailing_spaces_significant

    for name and path comparisons, is trailing space to be considered significant. (default is false)

    logical(kind=LK), intent(in), optional :: case_sensitive_keys

    for name and path comparisons, are they case sensitive. (default is true)

    logical(kind=LK), intent(in), optional :: no_whitespace

    if true, printing the JSON structure is done without adding any non-significant spaces or linebreaks (default is false)

    logical(kind=LK), intent(in), optional :: unescape_strings

    If false, then the raw escaped string is returned from json_get_string and similar routines. If true [default], then the string is returned unescaped.

    character(kind=CK,len=1), intent(in), optional :: comment_char

    If present, this character is used to denote comments in the JSON file, which will be ignored if present. Example: ! or #. Setting this to a blank string disables the ignoring of comments. (Default is !).

    integer(kind=IK), intent(in), optional :: path_mode

    How the path strings are interpreted in the get_by_path routines: * 1 – Default mode (see json_get_by_path_default) * 2 – as RFC 6901 "JSON Pointer" paths (see json_get_by_path_rfc6901) * 3 – JSONPath "bracket-notation" see json_get_by_path_jsonpath_bracket)

    character(kind=CK,len=1), intent(in), optional :: path_separator

    The path separator to use in the "default" mode for the paths in the various get_by_path routines. Example: . [default] or %. Note: if path_mode/=1 then this is ignored.

    logical(kind=LK), intent(in), optional :: compress_vectors

    If true, then arrays of integers, nulls, doubles, and logicals are printed all on one line. [Note: no_whitespace will override this option if necessary]. (Default is False).

    logical(kind=LK), intent(in), optional :: allow_duplicate_keysRead more…
    logical(kind=LK), intent(in), optional :: escape_solidusRead more…
    logical(kind=LK), intent(in), optional :: stop_on_error

    If an exception is raised, then immediately quit. (Default is False).

  • private subroutine set_json_core_in_file(me, core)

    Set the json_core for this json_file.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    type(json_core), intent(in) :: core

procedure, public :: initialize_json_core_in_file

  • private subroutine initialize_json_core_in_file(me, verbose, compact_reals, print_signs, real_format, spaces_per_tab, strict_type_checking, trailing_spaces_significant, case_sensitive_keys, no_whitespace, unescape_strings, comment_char, path_mode, path_separator, compress_vectors, allow_duplicate_keys, escape_solidus, stop_on_error)

    Initialize the json_core for this json_file. This is just a wrapper for json_initialize.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    logical(kind=LK), intent(in), optional :: verbose

    mainly useful for debugging (default is false)

    logical(kind=LK), intent(in), optional :: compact_reals

    to compact the real number strings for output (default is true)

    logical(kind=LK), intent(in), optional :: print_signs

    always print numeric sign (default is false)

    character(kind=CDK,len=*), intent(in), optional :: real_format

    Real number format: 'E' [default], '*', 'G', 'EN', or 'ES'

    integer(kind=IK), intent(in), optional :: spaces_per_tab

    number of spaces per tab for indenting (default is 2)

    logical(kind=LK), intent(in), optional :: strict_type_checking

    if true, no integer, double, or logical type conversions are done for the get routines (default is false)

    logical(kind=LK), intent(in), optional :: trailing_spaces_significant

    for name and path comparisons, is trailing space to be considered significant. (default is false)

    logical(kind=LK), intent(in), optional :: case_sensitive_keys

    for name and path comparisons, are they case sensitive. (default is true)

    logical(kind=LK), intent(in), optional :: no_whitespace

    if true, printing the JSON structure is done without adding any non-significant spaces or linebreaks (default is false)

    logical(kind=LK), intent(in), optional :: unescape_strings

    If false, then the raw escaped string is returned from json_get_string and similar routines. If true [default], then the string is returned unescaped.

    character(kind=CK,len=1), intent(in), optional :: comment_char

    If present, this character is used to denote comments in the JSON file, which will be ignored if present. Example: ! or #. Setting this to a blank string disables the ignoring of comments. (Default is !).

    integer(kind=IK), intent(in), optional :: path_mode

    How the path strings are interpreted in the get_by_path routines: * 1 – Default mode (see json_get_by_path_default) * 2 – as RFC 6901 "JSON Pointer" paths (see json_get_by_path_rfc6901) * 3 – JSONPath "bracket-notation" see json_get_by_path_jsonpath_bracket)

    character(kind=CK,len=1), intent(in), optional :: path_separator

    The path separator to use in the "default" mode for the paths in the various get_by_path routines. Example: . [default] or %. Note: if path_mode/=1 then this is ignored.

    logical(kind=LK), intent(in), optional :: compress_vectors

    If true, then arrays of integers, nulls, doubles, and logicals are printed all on one line. [Note: no_whitespace will override this option if necessary]. (Default is False).

    logical(kind=LK), intent(in), optional :: allow_duplicate_keysRead more…
    logical(kind=LK), intent(in), optional :: escape_solidusRead more…
    logical(kind=LK), intent(in), optional :: stop_on_error

    If an exception is raised, then immediately quit. (Default is False).

procedure, public :: json_file_add_double

  • private subroutine json_file_add_double(me, path, val, found, was_created)

    Author
    Jacob Williams

    Add a real(RK) variable value to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

procedure, public :: json_file_add_double_vec

  • private subroutine json_file_add_double_vec(me, path, vec, found, was_created)

    Author
    Jacob Williams

    Add a real(RK) vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

procedure, public :: json_file_add_integer

  • private subroutine json_file_add_integer(me, path, val, found, was_created)

    Author
    Jacob Williams

    Add an integer value to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

procedure, public :: json_file_add_integer_vec

  • private subroutine json_file_add_integer_vec(me, path, vec, found, was_created)

    Author
    Jacob Williams

    Add an integer vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

procedure, public :: json_file_add_logical

  • private subroutine json_file_add_logical(me, path, val, found, was_created)

    Author
    Jacob Williams

    Add a logical(LK) value to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    logical(kind=LK), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

procedure, public :: json_file_add_logical_vec

  • private subroutine json_file_add_logical_vec(me, path, vec, found, was_created)

    Author
    Jacob Williams

    Add a logical(LK) vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    logical(kind=LK), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

procedure, public :: json_file_add_object

  • private subroutine json_file_add_object(me, path, p, found, was_created)

    Author
    Jacob Williams

    Add a json_value pointer to an object to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    type(json_value), intent(in), pointer:: p

    pointer to the variable to add

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

procedure, public :: json_file_add_string

  • private subroutine json_file_add_string(me, path, val, found, was_created, trim_str, adjustl_str)

    Author
    Jacob Williams

    Add a character string to a json file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(in) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

    logical(kind=LK), intent(in), optional :: trim_str

    if TRIM() should be called for the val

    logical(kind=LK), intent(in), optional :: adjustl_str

    if ADJUSTL() should be called for the val (note that ADJUSTL is done before TRIM)

procedure, public :: json_file_add_string_vec

  • private subroutine json_file_add_string_vec(me, path, vec, found, was_created, ilen, trim_str, adjustl_str)

    Author
    Jacob Williams

    Add a string vector to a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(in), dimension(:):: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

    logical(kind=LK), intent(out), optional :: was_created

    if the variable had to be created

    integer(kind=IK), intent(in), optional dimension(:):: ilen

    the string lengths of each element in value. If not present, the full len(value) string is added for each element.

    logical(kind=LK), intent(in), optional :: trim_str

    if TRIM() should be called for each element

    logical(kind=LK), intent(in), optional :: adjustl_str

    if ADJUSTL() should be called for each element (note that ADJUSTL is done before TRIM)

procedure, public :: json_file_get_alloc_string_vec

  • private subroutine json_file_get_alloc_string_vec(me, path, vec, ilen, found)

    Author
    Jacob Williams
    Date
    12/17/2016

    Get an (allocatable length) string vector from a JSON file. This is just a wrapper for json_get_alloc_string_vec_by_path.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=:), intent(out), dimension(:), allocatable:: vec

    value vector

    integer(kind=IK), intent(out), dimension(:), allocatable:: ilen

    the actual length of each character string in the array

    logical(kind=LK), intent(out), optional :: found

procedure, public :: json_file_get_double

  • private subroutine json_file_get_double(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get a real(RK) variable value from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(out) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_double_vec

  • private subroutine json_file_get_double_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/19/2014

    Get a real(RK) vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    real(kind=RK), intent(out), dimension(:), allocatable:: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_integer

  • private subroutine json_file_get_integer(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get an integer value from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(out) :: val

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_integer_vec

  • private subroutine json_file_get_integer_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/20/2014

    Get an integer vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    integer(kind=IK), intent(out), dimension(:), allocatable:: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_logical

  • private subroutine json_file_get_logical(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get a logical(LK) value from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

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

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_logical_vec

  • private subroutine json_file_get_logical_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/20/2014

    Get a logical(LK) vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    logical(kind=LK), intent(out), dimension(:), allocatable:: vec

    the value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_object

  • private subroutine json_file_get_object(me, path, p, found)

    Author
    Jacob Williams
    Date
    2/3/2014

    Get a json_value pointer to an object from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    type(json_value), intent(out), pointer:: p

    pointer to the variable

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_root

procedure, public :: json_file_get_string

  • private subroutine json_file_get_string(me, path, val, found)

    Author
    Jacob Williams
    Date
    12/9/2013

    Get a character string from a json file. The output val is an allocatable character string.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

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

    value

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_get_string_vec

  • private subroutine json_file_get_string_vec(me, path, vec, found)

    Author
    Jacob Williams
    Date
    1/19/2014

    Get a string vector from a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(out), dimension(:), allocatable:: vec

    value vector

    logical(kind=LK), intent(out), optional :: found

    if it was really found

procedure, public :: json_file_load_from_string

  • private subroutine json_file_load_from_string(me, str)

    Author
    Jacob Williams
    Date
    1/13/2015

    Load the JSON data from a string.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: str

    string to load JSON data from

procedure, public :: json_file_print_1

  • private subroutine json_file_print_1(me, iunit)

    Author
    Jacob Williams
    Date
    12/9/2013

    Prints the JSON file to the specified file unit number.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    integer(kind=IK), intent(in) :: iunit

    file unit number (must not be -1)

procedure, public :: json_file_print_2

  • private subroutine json_file_print_2(me, filename)

    Author
    Jacob Williams
    Date
    1/11/2015

    Print the JSON structure to the specified filename. The file is opened, printed, and then closed.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CDK,len=*), intent(in) :: filename

    filename to print to

procedure, public :: json_file_print_to_console

  • private subroutine json_file_print_to_console(me)

    Author
    Jacob Williams
    Date
    1/11/2015

    Print the JSON file to the console.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me

procedure, public :: json_file_rename

  • private subroutine json_file_rename(me, path, name, found)

    Author
    Jacob Williams

    Rename a variable in a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(in) :: name

    the new name

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

procedure, public :: json_file_update_integer

  • private subroutine json_file_update_integer(me, path, val, found)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    integer(kind=IK), intent(in) :: val
    logical(kind=LK), intent(out) :: found

procedure, public :: json_file_update_logical

  • private subroutine json_file_update_logical(me, path, val, found)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    logical(kind=LK), intent(in) :: val
    logical(kind=LK), intent(out) :: found

procedure, public :: json_file_update_real

  • private subroutine json_file_update_real(me, path, val, found)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    real(kind=RK), intent(in) :: val
    logical(kind=LK), intent(out) :: found

procedure, public :: json_file_update_string

  • private subroutine json_file_update_string(me, path, val, found, trim_str, adjustl_str)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    character(kind=CK,len=*), intent(in) :: val
    logical(kind=LK), intent(out) :: found
    logical(kind=LK), intent(in), optional :: trim_str

    if TRIM() should be called for the val

    logical(kind=LK), intent(in), optional :: adjustl_str

    if ADJUSTL() should be called for the val (note that ADJUSTL is done before TRIM)

procedure, public :: json_file_valid_path

  • private function json_file_valid_path(me, path) result(found)

    Author
    Jacob Williams

    Returns true if the path is present in the JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    Return Value logical(kind=LK)

    if the variable was found

procedure, public, pass(me) :: json_file_valid_path_op

  • private function json_file_valid_path_op(path, me) result(found)

    Author
    Jacob Williams

    A wrapper for json_file_valid_path for the .in. operator

    Arguments

    Type IntentOptional AttributesName
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    class(json_file), intent(in) :: me

    the JSON file

    Return Value logical(kind=LK)

    if the variable was found

procedure, public :: json_file_variable_info

  • private subroutine json_file_variable_info(me, path, found, var_type, n_children, name)

    Author
    Jacob Williams
    Date
    2/3/2014

    Returns information about a variable in a json_file.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    path to the variable

    logical(kind=LK), intent(out), optional :: found

    the variable exists in the structure

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

    variable type

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

    number of children

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

    variable name

procedure, public :: json_file_variable_matrix_info

  • private subroutine json_file_variable_matrix_info(me, path, is_matrix, found, var_type, n_sets, set_size, name)

    Author
    Jacob Williams
    Date
    6/26/2016

    Returns matrix information about a variable in a json_file.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    path to the variable

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

    true if it is a valid matrix

    logical(kind=LK), intent(out), optional :: found

    true if it was found

    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

procedure, public :: load_file => json_file_load

  • private subroutine json_file_load(me, filename, unit)

    Author
    Jacob Williams
    Date
    12/9/2013

    Load the JSON data from a file.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CDK,len=*), intent(in) :: filename

    the filename to open

    integer(kind=IK), intent(in), optional :: unit

    the unit number to use (if not present, a newunit is used)

generic, public :: load_from_string => json_file_load_from_string

  • private subroutine json_file_load_from_string(me, str)

    Author
    Jacob Williams
    Date
    1/13/2015

    Load the JSON data from a string.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: str

    string to load JSON data from

generic, public :: matrix_info => json_file_variable_matrix_info

  • private subroutine json_file_variable_matrix_info(me, path, is_matrix, found, var_type, n_sets, set_size, name)

    Author
    Jacob Williams
    Date
    6/26/2016

    Returns matrix information about a variable in a json_file.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    path to the variable

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

    true if it is a valid matrix

    logical(kind=LK), intent(out), optional :: found

    true if it was found

    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

procedure, public :: move => json_file_move_pointer

generic, public :: operator(.in.) => json_file_valid_path_op

  • private function json_file_valid_path_op(path, me) result(found)

    Author
    Jacob Williams

    A wrapper for json_file_valid_path for the .in. operator

    Arguments

    Type IntentOptional AttributesName
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    class(json_file), intent(in) :: me

    the JSON file

    Return Value logical(kind=LK)

    if the variable was found

procedure, public :: print_error_message => json_file_print_error_message

  • private subroutine json_file_print_to_console(me)

    Author
    Jacob Williams
    Date
    1/11/2015

    Print the JSON file to the console.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
  • private subroutine json_file_print_1(me, iunit)

    Author
    Jacob Williams
    Date
    12/9/2013

    Prints the JSON file to the specified file unit number.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    integer(kind=IK), intent(in) :: iunit

    file unit number (must not be -1)

  • private subroutine json_file_print_2(me, filename)

    Author
    Jacob Williams
    Date
    1/11/2015

    Print the JSON structure to the specified filename. The file is opened, printed, and then closed.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CDK,len=*), intent(in) :: filename

    filename to print to

procedure, public :: print_to_string => json_file_print_to_string

  • private subroutine json_file_print_to_string(me, str)

    Author
    Jacob Williams
    Date
    1/11/2015

    Print the JSON file to a string.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=:), intent(out), allocatable:: str

    string to print JSON data to

generic, public :: rename => json_file_rename

Rename a variable, specifying it by path

  • private subroutine json_file_rename(me, path, name, found)

    Author
    Jacob Williams

    Rename a variable in a JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    character(kind=CK,len=*), intent(in) :: name

    the new name

    logical(kind=LK), intent(out), optional :: found

    if the variable was found

procedure, public :: set_json_core_in_file

procedure, public :: traverse => json_file_traverse

Update a scalar variable in a json_file, by specifying the path.

  • private subroutine json_file_update_integer(me, path, val, found)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    integer(kind=IK), intent(in) :: val
    logical(kind=LK), intent(out) :: found
  • private subroutine json_file_update_logical(me, path, val, found)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    logical(kind=LK), intent(in) :: val
    logical(kind=LK), intent(out) :: found
  • private subroutine json_file_update_real(me, path, val, found)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    real(kind=RK), intent(in) :: val
    logical(kind=LK), intent(out) :: found
  • private subroutine json_file_update_string(me, path, val, found, trim_str, adjustl_str)

    Author
    Jacob Williams
    Date
    1/10/2015

    Given the path string, if the variable is present in the file, and is a scalar, then update its value. If it is not present, then create it and set its value.

    Read more…

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path
    character(kind=CK,len=*), intent(in) :: val
    logical(kind=LK), intent(out) :: found
    logical(kind=LK), intent(in), optional :: trim_str

    if TRIM() should be called for the val

    logical(kind=LK), intent(in), optional :: adjustl_str

    if ADJUSTL() should be called for the val (note that ADJUSTL is done before TRIM)

generic, public :: valid_path => json_file_valid_path

Verify that a path is valid (i.e., a variable with this path exists in the file).

  • private function json_file_valid_path(me, path) result(found)

    Author
    Jacob Williams

    Returns true if the path is present in the JSON file.

    Arguments

    Type IntentOptional AttributesName
    class(json_file), intent(inout) :: me
    character(kind=CK,len=*), intent(in) :: path

    the path to the variable

    Return Value logical(kind=LK)

    if the variable was found

Source Code

    type,public :: json_file

        private

        type(json_core) :: core !! The instance of the [[json_core(type)]] factory used for this file.
        type(json_value),pointer :: p => null()  !! the JSON structure read from the file

    contains

        generic,public :: initialize => initialize_json_core_in_file,&
                                        set_json_core_in_file

        procedure,public :: get_core => get_json_core_in_file

        procedure,public :: load_file => json_file_load

        generic,public :: load_from_string => MAYBEWRAP(json_file_load_from_string)

        procedure,public :: destroy => json_file_destroy
        procedure,public :: move    => json_file_move_pointer
        generic,public   :: info    => MAYBEWRAP(json_file_variable_info)
        generic,public   :: matrix_info => MAYBEWRAP(json_file_variable_matrix_info)

        !error checking:
        procedure,public :: failed => json_file_failed
        procedure,public :: print_error_message => json_file_print_error_message
        procedure,public :: check_for_errors => json_file_check_for_errors
        procedure,public :: clear_exceptions => json_file_clear_exceptions

        procedure,public :: print_to_string => json_file_print_to_string

        generic,public :: print_file => json_file_print_to_console, &
                                        json_file_print_1, &
                                        json_file_print_2


        !>
        !  Rename a variable, specifying it by path
        generic,public :: rename => MAYBEWRAP(json_file_rename)
#ifdef USE_UCS4
        generic,public :: rename => json_file_rename_path_ascii, &
                                    json_file_rename_name_ascii
#endif

        !>
        !  Verify that a path is valid
        !  (i.e., a variable with this path exists in the file).
        generic,public :: valid_path => MAYBEWRAP(json_file_valid_path)

        !>
        !  Get a variable from a [[json_file(type)]], by specifying the path.
        generic,public :: get => MAYBEWRAP(json_file_get_object),      &
                                 MAYBEWRAP(json_file_get_integer),     &
                                 MAYBEWRAP(json_file_get_double),      &
                                 MAYBEWRAP(json_file_get_logical),     &
                                 MAYBEWRAP(json_file_get_string),      &
                                 MAYBEWRAP(json_file_get_integer_vec), &
                                 MAYBEWRAP(json_file_get_double_vec),  &
                                 MAYBEWRAP(json_file_get_logical_vec), &
                                 MAYBEWRAP(json_file_get_string_vec),  &
                                 MAYBEWRAP(json_file_get_alloc_string_vec),  &
                                 json_file_get_root

        !>
        !  Add a variable to a [[json_file(type)]], by specifying the path.
        !
        !### Example
        !
        !```fortran
        !  program test
        !  use json_module, rk=>json_rk, ik=>json_ik
        !  implicit none
        !  type(json_file) :: f
        !  call f%initialize()  ! specify whatever init options you want.
        !  call f%add('inputs.t', 0.0_rk)
        !  call f%add('inputs.x', [1.0_rk,2.0_rk,3.0_rk])
        !  call f%add('inputs.flag', .true.)
        !  call f%print_file()
        !  end program test
        !```
        generic,public :: add => MAYBEWRAP(json_file_add_object),      &
                                 MAYBEWRAP(json_file_add_integer),     &
                                 MAYBEWRAP(json_file_add_double),      &
                                 MAYBEWRAP(json_file_add_logical),     &
                                 MAYBEWRAP(json_file_add_string),      &
                                 MAYBEWRAP(json_file_add_integer_vec), &
                                 MAYBEWRAP(json_file_add_double_vec),  &
                                 MAYBEWRAP(json_file_add_logical_vec), &
                                 MAYBEWRAP(json_file_add_string_vec)
#ifdef USE_UCS4
        generic,public :: add => json_file_add_string_path_ascii, &
                                 json_file_add_string_value_ascii,&
                                 json_file_add_string_vec_path_ascii,&
                                 json_file_add_string_vec_vec_ascii
#endif

        !>
        !  Update a scalar variable in a [[json_file(type)]],
        !  by specifying the path.
        !
        !@note These have been mostly supplanted by the `add`
        !      methods, which do a similar thing (and can be used for
        !      scalars and vectors, etc.)
        generic,public :: update =>  MAYBEWRAP(json_file_update_integer),  &
                                     MAYBEWRAP(json_file_update_logical),  &
                                     MAYBEWRAP(json_file_update_real),     &
                                     MAYBEWRAP(json_file_update_string)
#ifdef USE_UCS4
        generic,public :: update => json_file_update_string_name_ascii, &
                                    json_file_update_string_val_ascii
#endif

        !traverse
        procedure,public :: traverse => json_file_traverse

        ! ***************************************************
        ! operators
        ! ***************************************************

        generic,public :: operator(.in.) => MAYBEWRAP(json_file_valid_path_op)
        procedure,pass(me) :: MAYBEWRAP(json_file_valid_path_op)

        ! ***************************************************
        ! private routines
        ! ***************************************************

        !load from string:
        procedure :: MAYBEWRAP(json_file_load_from_string)

        !initialize
        procedure :: initialize_json_core_in_file
        procedure :: set_json_core_in_file

        !get info:
        procedure :: MAYBEWRAP(json_file_variable_info)
        procedure :: MAYBEWRAP(json_file_variable_matrix_info)

        !rename:
        procedure :: MAYBEWRAP(json_file_rename)
#ifdef USE_UCS4
        procedure :: json_file_rename_path_ascii
        procedure :: json_file_rename_name_ascii
#endif

        !validate path:
        procedure :: MAYBEWRAP(json_file_valid_path)

        !get:
        procedure :: MAYBEWRAP(json_file_get_object)
        procedure :: MAYBEWRAP(json_file_get_integer)
        procedure :: MAYBEWRAP(json_file_get_double)
        procedure :: MAYBEWRAP(json_file_get_logical)
        procedure :: MAYBEWRAP(json_file_get_string)
        procedure :: MAYBEWRAP(json_file_get_integer_vec)
        procedure :: MAYBEWRAP(json_file_get_double_vec)
        procedure :: MAYBEWRAP(json_file_get_logical_vec)
        procedure :: MAYBEWRAP(json_file_get_string_vec)
        procedure :: MAYBEWRAP(json_file_get_alloc_string_vec)
        procedure :: json_file_get_root

        !add:
        procedure :: MAYBEWRAP(json_file_add_object)
        procedure :: MAYBEWRAP(json_file_add_integer)
        procedure :: MAYBEWRAP(json_file_add_double)
        procedure :: MAYBEWRAP(json_file_add_logical)
        procedure :: MAYBEWRAP(json_file_add_string)
        procedure :: MAYBEWRAP(json_file_add_integer_vec)
        procedure :: MAYBEWRAP(json_file_add_double_vec)
        procedure :: MAYBEWRAP(json_file_add_logical_vec)
        procedure :: MAYBEWRAP(json_file_add_string_vec)
#ifdef USE_UCS4
        procedure :: json_file_add_string_path_ascii
        procedure :: json_file_add_string_value_ascii
        procedure :: json_file_add_string_vec_path_ascii
        procedure :: json_file_add_string_vec_vec_ascii
#endif

        !update:
        procedure :: MAYBEWRAP(json_file_update_integer)
        procedure :: MAYBEWRAP(json_file_update_logical)
        procedure :: MAYBEWRAP(json_file_update_real)
        procedure :: MAYBEWRAP(json_file_update_string)
#ifdef USE_UCS4
        procedure :: json_file_update_string_name_ascii
        procedure :: json_file_update_string_val_ascii
#endif

        !print_file:
        procedure :: json_file_print_to_console
        procedure :: json_file_print_1
        procedure :: json_file_print_2

    end type json_file