annotate libinterp/corefcn/jsondecode.cc @ 29977:0d67814eb038

jsondecode.cc: New option "makeValidName" to disable string validation. This cset is part of GSoC 2021. Octave structures are "more powerful" compared to Matlab. For example, the following works in Octave only struct ("image/png", "data") In Matlab the `/` is a prohibited character by `matlab.lang.makeValidName`. Avoiding any substitutions becomes necessary to preserve the original key-value-pairs of a JSON structs. One example is to read, process, and write Jupyter-notebook files. In Matlab, `matlab.lang.makeValidName` is always applied on the "key" field, while Octaves' `jsondecode` offers options such as `prefix` and `ReplacementStyle` to adjust those settings. The new options allows turning off the whole validation entirely during the JSON decoding process. * libinterp/corefcn/jsondecode.cc: New option "makeValidName" to disable string validation. * test/json/jsondecode_BIST.tst: new test case for new option, fix white space (tabs).
author Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
date Tue, 17 Aug 2021 14:54:29 +0900
parents 7d6709900da7
children c7c69808356f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
1 ////////////////////////////////////////////////////////////////////////
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
2 //
29359
7854d5752dd2 maint: merge stable to default.
John W. Eaton <jwe@octave.org>
parents: 29092
diff changeset
3 // Copyright (C) 2020-2021 The Octave Project Developers
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
4 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
6 // distribution or <https://octave.org/copyright/>.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
7 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
8 // This file is part of Octave.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
9 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
11 // under the terms of the GNU General Public License as published by
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
13 // (at your option) any later version.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
14 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
18 // GNU General Public License for more details.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
19 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
20 // You should have received a copy of the GNU General Public License
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
21 // along with Octave; see the file COPYING. If not, see
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
22 // <https://www.gnu.org/licenses/>.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
23 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
24 ////////////////////////////////////////////////////////////////////////
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
25
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
26 #if defined (HAVE_CONFIG_H)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
27 # include "config.h"
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
28 #endif
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
29
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
30 #include "defun.h"
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
31 #include "error.h"
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
32 #include "errwarn.h"
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
33 #include "oct-string.h"
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
34 #include "ovl.h"
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
35 #include "utils.h"
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
36
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
37 #if defined (HAVE_RAPIDJSON)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
38 # include <rapidjson/document.h>
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
39 # include <rapidjson/error/en.h>
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
40 #endif
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
41
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
42 #if defined (HAVE_RAPIDJSON)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
43
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
44 octave_value
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
45 decode (const rapidjson::Value& val,
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
46 const octave::make_valid_name_options* options);
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
47
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
48 //! Decodes a numerical JSON value into a scalar number.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
49 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
50 //! @param val JSON value that is guaranteed to be a numerical value.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
51 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
52 //! @return @ref octave_value that contains the numerical value of @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
53 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
54 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
55 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
56 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
57 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
58 //! d.Parse ("123");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
59 //! octave_value num = decode_number (d);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
60 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
61
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
62 octave_value
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
63 decode_number (const rapidjson::Value& val)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
64 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
65 if (val.IsUint ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
66 return octave_value (val.GetUint ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
67 else if (val.IsInt ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
68 return octave_value (val.GetInt ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
69 else if (val.IsUint64 ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
70 return octave_value (val.GetUint64 ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
71 else if (val.IsInt64 ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
72 return octave_value (val.GetInt64 ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
73 else if (val.IsDouble ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
74 return octave_value (val.GetDouble ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
75 else
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
76 error ("jsondecode: unidentified type");
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
77 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
78
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
79 //! Decodes a JSON object into a scalar struct.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
80 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
81 //! @param val JSON value that is guaranteed to be a JSON object.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
82 //! @param options @c ReplacementStyle and @c Prefix options with their values.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
83 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
84 //! @return @ref octave_value that contains the equivalent scalar struct of @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
85 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
86 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
87 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
88 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
89 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
90 //! d.Parse ("{\"a\": 1, \"b\": 2}");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
91 //! octave_value struct = decode_object (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
92 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
93
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
94 octave_value
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
95 decode_object (const rapidjson::Value& val,
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
96 const octave::make_valid_name_options* options)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
97 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
98 octave_scalar_map retval;
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
99
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
100 for (const auto& pair : val.GetObject ())
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
101 {
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
102 // Validator function "matlab.lang.makeValidName" to guarantee legitimate
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
103 // variable name.
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
104 std::string varname = pair.name.GetString ();
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
105 if (options != nullptr)
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
106 octave::make_valid_name (varname, *options);
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
107 retval.assign (varname, decode (pair.value, options));
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
108 }
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
109
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
110 return retval;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
111 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
112
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
113 //! Decodes a JSON array that contains only numerical or null values
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
114 //! into an NDArray.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
115 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
116 //! @param val JSON value that is guaranteed to be a numeric array.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
117 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
118 //! @return @ref octave_value that contains the equivalent NDArray of @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
119 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
120 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
121 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
122 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
123 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
124 //! d.Parse ("[1, 2, 3, 4]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
125 //! octave_value numeric_array = decode_numeric_array (d);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
126 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
127
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
128 octave_value
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
129 decode_numeric_array (const rapidjson::Value& val)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
130 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
131 NDArray retval (dim_vector (val.Size (), 1));
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
132 octave_idx_type index = 0;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
133 for (const auto& elem : val.GetArray ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
134 retval(index++) = elem.IsNull () ? octave_NaN
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
135 : decode_number (elem).double_value ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
136 return retval;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
137 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
138
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
139 //! Decodes a JSON array that contains only boolean values into a boolNDArray.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
140 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
141 //! @param val JSON value that is guaranteed to be a boolean array.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
142 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
143 //! @return @ref octave_value that contains the equivalent boolNDArray of @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
144 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
145 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
146 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
147 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
148 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
149 //! d.Parse ("[true, false, true]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
150 //! octave_value boolean_array = decode_boolean_array (d);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
151 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
152
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
153 octave_value
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
154 decode_boolean_array (const rapidjson::Value& val)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
155 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
156 boolNDArray retval (dim_vector (val.Size (), 1));
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
157 octave_idx_type index = 0;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
158 for (const auto& elem : val.GetArray ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
159 retval(index++) = elem.GetBool ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
160 return retval;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
161 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
162
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
163 //! Decodes a JSON array that contains different types
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
164 //! or string values only into a Cell.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
165 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
166 //! @param val JSON value that is guaranteed to be a mixed or string array.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
167 //! @param options @c ReplacementStyle and @c Prefix options with their values.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
168 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
169 //! @return @ref octave_value that contains the equivalent Cell of @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
170 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
171 //! @b Example (decoding a string array):
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
172 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
173 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
174 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
175 //! d.Parse ("[\"foo\", \"bar\", \"baz\"]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
176 //! octave_value cell = decode_string_and_mixed_array (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
177 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
178 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
179 //! @b Example (decoding a mixed array):
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
180 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
181 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
182 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
183 //! d.Parse ("[\"foo\", 123, true]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
184 //! octave_value cell = decode_string_and_mixed_array (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
185 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
186
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
187 octave_value
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
188 decode_string_and_mixed_array (const rapidjson::Value& val,
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
189 const octave::make_valid_name_options* options)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
190 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
191 Cell retval (dim_vector (val.Size (), 1));
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
192 octave_idx_type index = 0;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
193 for (const auto& elem : val.GetArray ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
194 retval(index++) = decode (elem, options);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
195 return retval;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
196 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
197
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
198 //! Decodes a JSON array that contains only objects into a Cell or struct array
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
199 //! depending on the similarity of the objects' keys.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
200 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
201 //! @param val JSON value that is guaranteed to be an object array.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
202 //! @param options @c ReplacementStyle and @c Prefix options with their values.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
203 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
204 //! @return @ref octave_value that contains the equivalent Cell
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
205 //! or struct array of @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
206 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
207 //! @b Example (returns a struct array):
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
208 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
209 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
210 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
211 //! d.Parse ("[{\"a\":1,\"b\":2},{\"a\":3,\"b\":4}]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
212 //! octave_value object_array = decode_object_array (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
213 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
214 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
215 //! @b Example (returns a Cell):
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
216 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
217 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
218 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
219 //! d.Parse ("[{\"a\":1,\"b\":2},{\"b\":3,\"a\":4}]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
220 //! octave_value object_array = decode_object_array (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
221 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
222
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
223 octave_value
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
224 decode_object_array (const rapidjson::Value& val,
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
225 const octave::make_valid_name_options* options)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
226 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
227 Cell struct_cell = decode_string_and_mixed_array (val, options).cell_value ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
228 string_vector field_names = struct_cell(0).scalar_map_value ().fieldnames ();
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
229
28625
173807014259 jsondecode.cc: Prefer STL to custom comparison function
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28624
diff changeset
230 bool same_field_names = true;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
231 for (octave_idx_type i = 1; i < struct_cell.numel (); ++i)
28625
173807014259 jsondecode.cc: Prefer STL to custom comparison function
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28624
diff changeset
232 if (field_names.std_list ()
173807014259 jsondecode.cc: Prefer STL to custom comparison function
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28624
diff changeset
233 != struct_cell(i).scalar_map_value ().fieldnames ().std_list ())
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
234 {
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
235 same_field_names = false;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
236 break;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
237 }
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
238
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
239 if (same_field_names)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
240 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
241 octave_map struct_array;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
242 Cell value (dim_vector (struct_cell.numel (), 1));
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
243 for (octave_idx_type i = 0; i < field_names.numel (); ++i)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
244 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
245 for (octave_idx_type k = 0; k < struct_cell.numel (); ++k)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
246 value(k) = struct_cell(k).scalar_map_value ().getfield (field_names(i));
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
247 struct_array.assign (field_names(i), value);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
248 }
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
249 return struct_array;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
250 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
251 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
252 return struct_cell;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
253 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
254
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
255 //! Decodes a JSON array that contains only arrays into a Cell or an NDArray
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
256 //! depending on the dimensions and element types of the sub-arrays.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
257 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
258 //! @param val JSON value that is guaranteed to be an array of arrays.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
259 //! @param options @c ReplacementStyle and @c Prefix options with their values.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
260 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
261 //! @return @ref octave_value that contains the equivalent Cell
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
262 //! or NDArray of @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
263 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
264 //! @b Example (returns an NDArray):
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
265 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
266 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
267 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
268 //! d.Parse ("[[1, 2], [3, 4]]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
269 //! octave_value array = decode_array_of_arrays (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
270 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
271 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
272 //! @b Example (returns a Cell):
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
273 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
274 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
275 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
276 //! d.Parse ("[[1, 2], [3, 4, 5]]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
277 //! octave_value cell = decode_array_of_arrays (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
278 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
279
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
280 octave_value
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
281 decode_array_of_arrays (const rapidjson::Value& val,
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
282 const octave::make_valid_name_options* options)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
283 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
284 // Some arrays should be decoded as NDArrays and others as cell arrays
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
285 Cell cell = decode_string_and_mixed_array (val, options).cell_value ();
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
286
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
287 // Only arrays with sub-arrays of booleans and numericals will return NDArray
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
288 bool is_bool = cell(0).is_bool_matrix ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
289 dim_vector sub_array_dims = cell(0).dims ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
290 octave_idx_type sub_array_ndims = cell(0).ndims ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
291 octave_idx_type cell_numel = cell.numel ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
292 for (octave_idx_type i = 0; i < cell_numel; ++i)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
293 {
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
294 // If one element is cell return the cell array as at least one of the
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
295 // sub-arrays area either an array of: strings, objects or mixed array
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
296 if (cell(i).iscell ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
297 return cell;
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
298 // If not the same dim of elements or dim = 0, return cell array
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
299 if (cell(i).dims () != sub_array_dims || sub_array_dims == dim_vector ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
300 return cell;
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
301 // If not numeric sub-arrays only or bool sub-arrays only,
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
302 // return cell array
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
303 if (cell(i).is_bool_matrix () != is_bool)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
304 return cell;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
305 }
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
306
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
307 // Calculate the dims of the output array
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
308 dim_vector array_dims;
28801
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
309 array_dims.resize (sub_array_ndims + 1);
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
310 array_dims(0) = cell_numel;
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
311 for (auto i = 1; i < sub_array_ndims + 1; i++)
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
312 array_dims(i) = sub_array_dims(i-1);
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
313 NDArray array (array_dims);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
314
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
315 // Populate the array with specific order to generate MATLAB-identical output
29708
fbcc3a680826 Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents: 29359
diff changeset
316 octave_idx_type sub_array_numel = array.numel () / cell_numel;
fbcc3a680826 Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents: 29359
diff changeset
317 for (octave_idx_type k = 0; k < cell_numel; ++k)
fbcc3a680826 Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents: 29359
diff changeset
318 {
fbcc3a680826 Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents: 29359
diff changeset
319 NDArray sub_array_value = cell(k).array_value ();
fbcc3a680826 Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents: 29359
diff changeset
320 for (octave_idx_type i = 0; i < sub_array_numel; ++i)
fbcc3a680826 Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents: 29359
diff changeset
321 array(k + i*cell_numel) = sub_array_value(i);
fbcc3a680826 Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents: 29359
diff changeset
322 }
28801
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
323
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
324 if (is_bool)
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
325 return boolNDArray (array);
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
326 else
ffa6c50c2eaa Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28761
diff changeset
327 return array;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
328 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
329
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
330 //! Decodes any type of JSON arrays. This function only serves as an interface
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
331 //! by choosing which function to call from the previous functions.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
332 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
333 //! @param val JSON value that is guaranteed to be an array.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
334 //! @param options @c ReplacementStyle and @c Prefix options with their values.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
335 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
336 //! @return @ref octave_value that contains the output of decoding @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
337 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
338 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
339 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
340 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
341 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
342 //! d.Parse ("[[1, 2], [3, 4, 5]]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
343 //! octave_value array = decode_array (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
344 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
345
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
346 octave_value
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
347 decode_array (const rapidjson::Value& val,
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
348 const octave::make_valid_name_options* options)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
349 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
350 // Handle empty arrays
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
351 if (val.Empty ())
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
352 return NDArray ();
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
353
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
354 // Compare with other elements to know if the array has multiple types
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
355 rapidjson::Type array_type = val[0].GetType ();
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
356 // Check if the array is numeric and if it has multiple types
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
357 bool same_type = true;
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
358 bool is_numeric = true;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
359 for (const auto& elem : val.GetArray ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
360 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
361 rapidjson::Type current_elem_type = elem.GetType ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
362 if (is_numeric && ! (current_elem_type == rapidjson::kNullType
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
363 || current_elem_type == rapidjson::kNumberType))
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
364 is_numeric = false;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
365 if (same_type && (current_elem_type != array_type))
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
366 // RapidJSON doesn't have kBoolean Type it has kTrueType and kFalseType
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
367 if (! ((current_elem_type == rapidjson::kTrueType
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
368 && array_type == rapidjson::kFalseType)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
369 || (current_elem_type == rapidjson::kFalseType
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
370 && array_type == rapidjson::kTrueType)))
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
371 same_type = false;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
372 }
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
373
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
374 if (is_numeric)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
375 return decode_numeric_array (val);
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
376
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
377 if (same_type && (array_type != rapidjson::kStringType))
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
378 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
379 if (array_type == rapidjson::kTrueType
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
380 || array_type == rapidjson::kFalseType)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
381 return decode_boolean_array (val);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
382 else if (array_type == rapidjson::kObjectType)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
383 return decode_object_array (val, options);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
384 else if (array_type == rapidjson::kArrayType)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
385 return decode_array_of_arrays (val, options);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
386 else
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
387 error ("jsondecode: unidentified type");
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
388 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
389 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
390 return decode_string_and_mixed_array (val, options);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
391 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
392
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
393 //! Decodes any JSON value. This function only serves as an interface
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
394 //! by choosing which function to call from the previous functions.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
395 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
396 //! @param val JSON value.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
397 //! @param options @c ReplacementStyle and @c Prefix options with their values.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
398 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
399 //! @return @ref octave_value that contains the output of decoding @p val.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
400 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
401 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
402 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
403 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
404 //! rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
405 //! d.Parse ("[{\"a\":1,\"b\":2},{\"b\":3,\"a\":4}]");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
406 //! octave_value value = decode (d, octave_value_list ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
407 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
408
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
409 octave_value
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
410 decode (const rapidjson::Value& val,
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
411 const octave::make_valid_name_options* options)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
412 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
413 if (val.IsBool ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
414 return val.GetBool ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
415 else if (val.IsNumber ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
416 return decode_number (val);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
417 else if (val.IsString ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
418 return val.GetString ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
419 else if (val.IsObject ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
420 return decode_object (val, options);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
421 else if (val.IsNull ())
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
422 return NDArray ();
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
423 else if (val.IsArray ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
424 return decode_array (val, options);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
425 else
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
426 error ("jsondecode: unidentified type");
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
427 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
428
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
429 #endif
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
430
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29708
diff changeset
431 OCTAVE_NAMESPACE_BEGIN
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29708
diff changeset
432
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
433 DEFUN (jsondecode, args, ,
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
434 doc: /* -*- texinfo -*-
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
435 @deftypefn {} {@var{object} =} jsondecode (@var{JSON_txt})
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
436 @deftypefnx {} {@var{object} =} jsondecode (@dots{}, "ReplacementStyle", @var{rs})
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
437 @deftypefnx {} {@var{object} =} jsondecode (@dots{}, "Prefix", @var{pfx})
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
438 @deftypefnx {} {@var{object} =} jsondecode (@dots{}, "makeValidName", @var{TF})
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
439
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
440 Decode text that is formatted in JSON.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
441
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
442 The input @var{JSON_txt} is a string that contains JSON text.
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
443
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
444 The output @var{object} is an Octave object that contains the result of
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
445 decoding @var{JSON_txt}.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
446
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
447 For more information about the options @qcode{"ReplacementStyle"} and
28626
34696240591e doc: Improve JSON documentation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28625
diff changeset
448 @qcode{"Prefix"}, see
34696240591e doc: Improve JSON documentation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28625
diff changeset
449 @ref{XREFmatlab_lang_makeValidName,,matlab.lang.makeValidName}.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
450
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
451 If the value of the option @qcode{\"makeValidName\"} is false then names
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
452 will not be changed by @code{matlab.lang.makeValidName} and the
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
453 @qcode{\"ReplacementStyle\"} and @qcode{\"Prefix\"} options will be ignored.
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
454
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
455 NOTE: Decoding and encoding JSON text is not guaranteed to reproduce the
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
456 original text as some names may be changed by @code{matlab.lang.makeValidName}.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
457
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
458 This table shows the conversions from JSON data types to Octave data types:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
459
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
460 @multitable @columnfractions 0.50 0.50
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
461 @headitem JSON data type @tab Octave data type
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
462 @item Boolean @tab scalar logical
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
463 @item Number @tab scalar double
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
464 @item String @tab vector of characters
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
465 @item Object @tab scalar struct (field names of the struct may be different from the keys of the JSON object due to @code{matlab_lang_makeValidName}
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
466 @item null, inside a numeric array @tab @code{NaN}
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
467 @item null, inside a non-numeric array @tab empty double array @code{[]}
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
468 @item Array, of different data types @tab cell array
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
469 @item Array, of Booleans @tab logical array
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
470 @item Array, of Numbers @tab double array
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
471 @item Array, of Strings @tab cell array of character vectors (@code{cellstr})
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
472 @item Array of Objects, same field names @tab struct array
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
473 @item Array of Objects, different field names @tab cell array of scalar structs
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
474 @end multitable
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
475
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
476 Examples:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
477
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
478 @example
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
479 @group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
480 jsondecode ('[1, 2, null, 3]')
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
481 @result{} ans =
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
482
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
483 1
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
484 2
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
485 NaN
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
486 3
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
487 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
488
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
489 @group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
490 jsondecode ('["foo", "bar", ["foo", "bar"]]')
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
491 @result{} ans =
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
492 @{
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
493 [1,1] = foo
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
494 [2,1] = bar
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
495 [3,1] =
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
496 @{
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
497 [1,1] = foo
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
498 [2,1] = bar
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
499 @}
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
500
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
501 @}
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
502 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
503
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
504 @group
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
505 jsondecode ('@{"nu#m#ber": 7, "s#tr#ing": "hi"@}', ...
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
506 'ReplacementStyle', 'delete')
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
507 @result{} scalar structure containing the fields:
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
508
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
509 number = 7
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
510 string = hi
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
511 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
512
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
513 @group
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
514 jsondecode ('@{"nu#m#ber": 7, "s#tr#ing": "hi"@}', ...
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
515 'makeValidName', false)
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
516 @result{} scalar structure containing the fields:
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
517
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
518 nu#m#ber = 7
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
519 s#tr#ing = hi
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
520 @end group
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
521
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
522 @group
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
523 jsondecode ('@{"1": "one", "2": "two"@}', 'Prefix', 'm_')
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
524 @result{} scalar structure containing the fields:
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
525
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
526 m_1 = one
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
527 m_2 = two
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
528 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
529 @end example
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
530
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
531 @seealso{jsonencode, matlab.lang.makeValidName}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
532 @end deftypefn */)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
533 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
534 #if defined (HAVE_RAPIDJSON)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
535
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
536 int nargin = args.length ();
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
537
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
538 // makeValidName options are pairs, the number of arguments must be odd.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
539 if (! (nargin % 2))
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
540 print_usage ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
541
29977
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
542 // Detect if the user wants to use makeValidName
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
543 bool use_makeValidName = true;
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
544 octave_value_list make_valid_name_params;
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
545 for (auto i = 1; i < nargin; i = i + 2)
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
546 {
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
547 std::string parameter = args(i).xstring_value ("jsondecode: "
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
548 "option argument must be a string");
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
549 if (string::strcmpi (parameter, "makeValidName"))
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
550 {
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
551 use_makeValidName = args(i + 1).xbool_value ("jsondecode: "
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
552 "'makeValidName' value must be a bool");
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
553 }
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
554 else
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
555 make_valid_name_params.append (args.slice(i, 2));
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
556 }
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
557
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
558 make_valid_name_options* options = nullptr;
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
559
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
560 if (use_makeValidName)
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
561 {
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
562 make_valid_name_options options_obj (make_valid_name_params);
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
563 options = &options_obj;
0d67814eb038 jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29961
diff changeset
564 }
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
565
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
566 if (! args(0).is_string ())
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
567 error ("jsondecode: JSON_TXT must be a character string");
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
568
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
569 std::string json = args(0).string_value ();
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
570 rapidjson::Document d;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
571 // DOM is chosen instead of SAX as SAX publishes events to a handler that
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
572 // decides what to do depending on the event only. This will cause a
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
573 // problem in decoding JSON arrays as the output may be an array or a cell
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
574 // and that doesn't only depend on the event (startArray) but also on the
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
575 // types of the elements inside the array.
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
576 d.Parse <rapidjson::kParseNanAndInfFlag> (json.c_str ());
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
577
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
578 if (d.HasParseError ())
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
579 error ("jsondecode: parse error at offset %u: %s\n",
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
580 static_cast<unsigned int> (d.GetErrorOffset ()) + 1,
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
581 rapidjson::GetParseError_En (d.GetParseError ()));
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
582
29092
38e22065d9ec jsondecode.cc: use `octave::make_valid_name` not `matlab.lang.makeValidName` (patch #9998)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents: 28801
diff changeset
583 return decode (d, options);
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
584
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
585 #else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
586
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
587 octave_unused_parameter (args);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
588
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
589 err_disabled_feature ("jsondecode", "JSON decoding through RapidJSON");
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
590
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
591 #endif
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
592 }
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
593
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
594 /*
28761
b5461b1dc0ca Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents: 28750
diff changeset
595 Functional BIST tests are located in test/json/jsondecode_BIST.tst
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
596
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
597 ## Input validation tests
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
598 %!testif HAVE_RAPIDJSON
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
599 %! fail ("jsondecode ()");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
600 %! fail ("jsondecode ('1', 2)");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
601 %! fail ("jsondecode (1)", "JSON_TXT must be a character string");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
602 %! fail ("jsondecode ('12-')", "parse error at offset 3");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
603
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28626
diff changeset
604 */
29958
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29708
diff changeset
605
32c3a5805893 move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents: 29708
diff changeset
606 OCTAVE_NAMESPACE_END