Mercurial > octave
annotate libinterp/corefcn/jsondecode.cc @ 30564:796f54d4ddbf stable
update Octave Project Developers copyright for the new year
In files that have the "Octave Project Developers" copyright notice,
update for 2021.
In all .txi and .texi files except gpl.txi and gpl.texi in the
doc/liboctave and doc/interpreter directories, change the copyright
to "Octave Project Developers", the same as used for other source
files. Update copyright notices for 2022 (not done since 2019). For
gpl.txi and gpl.texi, change the copyright notice to be "Free Software
Foundation, Inc." and leave the date at 2007 only because this file
only contains the text of the GPL, not anything created by the Octave
Project Developers.
Add Paul Thomas to contributors.in.
author | John W. Eaton <jwe@octave.org> |
---|---|
date | Tue, 28 Dec 2021 18:22:40 -0500 |
parents | a61e1a0f6024 |
children | e88a07dec498 |
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 // |
30564
796f54d4ddbf
update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
30390
diff
changeset
|
3 // Copyright (C) 2020-2022 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 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
42 OCTAVE_NAMESPACE_BEGIN |
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
43 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
44 #if defined (HAVE_RAPIDJSON) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
45 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
46 static 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
|
47 decode (const rapidjson::Value& val, |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
48 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
|
49 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
50 //! 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
|
51 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
52 //! @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
|
53 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
54 //! @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
|
55 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
56 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
57 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
58 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
59 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
60 //! d.Parse ("123"); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
61 //! octave_value num = decode_number (d); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
62 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
63 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
64 static octave_value |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
65 decode_number (const rapidjson::Value& val) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
66 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
67 if (val.IsUint ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
68 return octave_value (val.GetUint ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
69 else if (val.IsInt ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
70 return octave_value (val.GetInt ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
71 else if (val.IsUint64 ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
72 return octave_value (val.GetUint64 ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
73 else if (val.IsInt64 ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
74 return octave_value (val.GetInt64 ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
75 else if (val.IsDouble ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
76 return octave_value (val.GetDouble ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
77 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
78 error ("jsondecode: unidentified type"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
79 } |
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 //! 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
|
82 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
83 //! @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
|
84 //! @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
|
85 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
86 //! @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
|
87 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
88 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
89 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
90 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
91 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
92 //! d.Parse ("{\"a\": 1, \"b\": 2}"); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
93 //! 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
|
94 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
95 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
96 static 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
|
97 decode_object (const rapidjson::Value& val, |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
98 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
|
99 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
100 octave_scalar_map retval; |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
101 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
102 for (const auto& pair : val.GetObject ()) |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
103 { |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
104 // Validator function "matlab.lang.makeValidName" to guarantee legitimate |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
105 // variable name. |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
106 std::string varname = pair.name.GetString (); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
107 if (options != nullptr) |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
108 octave::make_valid_name (varname, *options); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
109 retval.assign (varname, decode (pair.value, options)); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
110 } |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
111 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
112 return retval; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
113 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
114 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
115 //! 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
|
116 //! into an NDArray. |
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 //! @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
|
119 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
120 //! @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
|
121 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
122 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
123 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
124 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
125 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
126 //! d.Parse ("[1, 2, 3, 4]"); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
127 //! 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
|
128 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
129 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
130 static octave_value |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
131 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
|
132 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
133 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
|
134 octave_idx_type index = 0; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
135 for (const auto& elem : val.GetArray ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
136 retval(index++) = elem.IsNull () ? octave_NaN |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
137 : decode_number (elem).double_value (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
138 return retval; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
139 } |
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 //! 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
|
142 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
143 //! @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
|
144 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
145 //! @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
|
146 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
147 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
148 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
149 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
150 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
151 //! d.Parse ("[true, false, true]"); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
152 //! 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
|
153 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
154 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
155 static octave_value |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
156 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
|
157 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
158 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
|
159 octave_idx_type index = 0; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
160 for (const auto& elem : val.GetArray ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
161 retval(index++) = elem.GetBool (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
162 return retval; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
163 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
164 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
165 //! 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
|
166 //! 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
|
167 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
168 //! @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
|
169 //! @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
|
170 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
171 //! @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
|
172 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
173 //! @b Example (decoding a string array): |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
174 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
175 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
176 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
177 //! d.Parse ("[\"foo\", \"bar\", \"baz\"]"); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
178 //! 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
|
179 //! @endcode |
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 //! @b Example (decoding a mixed array): |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
182 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
183 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
184 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
185 //! d.Parse ("[\"foo\", 123, true]"); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
186 //! 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
|
187 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
188 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
189 static octave_value |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
190 decode_string_and_mixed_array (const rapidjson::Value& val, |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
191 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
|
192 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
193 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
|
194 octave_idx_type index = 0; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
195 for (const auto& elem : val.GetArray ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
196 retval(index++) = decode (elem, options); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
197 return retval; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
198 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
199 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
200 //! 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
|
201 //! 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
|
202 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
203 //! @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
|
204 //! @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
|
205 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
206 //! @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
|
207 //! or struct array of @p val. |
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 //! @b Example (returns a struct array): |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
210 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
211 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
212 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
213 //! 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
|
214 //! 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
|
215 //! @endcode |
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 //! @b Example (returns a Cell): |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
218 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
219 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
220 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
221 //! 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
|
222 //! 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
|
223 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
224 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
225 static octave_value |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
226 decode_object_array (const rapidjson::Value& val, |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
227 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
|
228 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
229 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
|
230 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
|
231 |
28625
173807014259
jsondecode.cc: Prefer STL to custom comparison function
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
28624
diff
changeset
|
232 bool same_field_names = true; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
233 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
|
234 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
|
235 != 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
|
236 { |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
237 same_field_names = false; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
238 break; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
239 } |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
240 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
241 if (same_field_names) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
242 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
243 octave_map struct_array; |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
244 dim_vector struct_array_dims = dim_vector (struct_cell.numel (), 1); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
245 |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
246 if (field_names.numel ()) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
247 { |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
248 Cell value (struct_array_dims); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
249 for (octave_idx_type i = 0; i < field_names.numel (); ++i) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
250 { |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
251 for (octave_idx_type k = 0; k < struct_cell.numel (); ++k) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
252 value(k) = struct_cell(k).scalar_map_value () |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
253 .getfield (field_names(i)); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
254 struct_array.assign (field_names(i), value); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
255 } |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
256 } |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
257 else |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
258 struct_array.resize (struct_array_dims, true); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
259 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
260 return struct_array; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
261 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
262 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
263 return struct_cell; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
264 } |
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 //! 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
|
267 //! 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
|
268 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
269 //! @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
|
270 //! @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
|
271 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
272 //! @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
|
273 //! or NDArray of @p val. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
274 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
275 //! @b Example (returns an NDArray): |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
276 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
277 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
278 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
279 //! d.Parse ("[[1, 2], [3, 4]]"); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
280 //! 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
|
281 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
282 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
283 //! @b Example (returns a Cell): |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
284 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
285 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
286 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
287 //! 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
|
288 //! 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
|
289 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
290 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
291 static octave_value |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
292 decode_array_of_arrays (const rapidjson::Value& val, |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
293 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
|
294 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
295 // 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
|
296 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
|
297 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
298 // 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
|
299 bool is_bool = cell(0).is_bool_matrix (); |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
300 bool is_struct = cell(0).isstruct (); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
301 string_vector field_names = is_struct ? cell(0).map_value ().fieldnames () |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
302 : string_vector (); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
303 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
|
304 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
|
305 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
|
306 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
|
307 { |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
308 // 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
|
309 // 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
|
310 if (cell(i).iscell ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
311 return cell; |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
312 // 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
|
313 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
|
314 return cell; |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
315 // 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
|
316 // return cell array |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
317 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
|
318 return cell; |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
319 // If not struct arrays only, return cell array |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
320 if (cell(i).isstruct () != is_struct) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
321 return cell; |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
322 // If struct arrays have different fields, return cell array |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
323 if (is_struct && (field_names.std_list () |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
324 != cell(i).map_value ().fieldnames ().std_list ())) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
325 return cell; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
326 } |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
327 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
328 // 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
|
329 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
|
330 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
|
331 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
|
332 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
|
333 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
|
334 |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
335 if (is_struct) |
29708
fbcc3a680826
Improve performance (> 100X) of jsondecode (bug #60625).
Rik <rik@octave.org>
parents:
29359
diff
changeset
|
336 { |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
337 octave_map struct_array; |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
338 array_dims.chop_trailing_singletons (); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
339 |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
340 if (field_names.numel ()) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
341 { |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
342 Cell value (array_dims); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
343 octave_idx_type sub_array_numel = sub_array_dims.numel (); |
28801
ffa6c50c2eaa
Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28761
diff
changeset
|
344 |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
345 for (octave_idx_type j = 0; j < field_names.numel (); ++j) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
346 { |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
347 // Populate the array with specific order to generate |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
348 // MATLAB-identical output. |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
349 for (octave_idx_type k = 0; k < cell_numel; ++k) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
350 { |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
351 Cell sub_array_value = cell(k).map_value () |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
352 .getfield (field_names(j)); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
353 for (octave_idx_type i = 0; i < sub_array_numel; ++i) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
354 value(k + i * cell_numel) = sub_array_value(i); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
355 } |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
356 struct_array.assign (field_names(j), value); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
357 } |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
358 } |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
359 else |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
360 struct_array.resize(array_dims, true); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
361 |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
362 return struct_array; |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
363 } |
28801
ffa6c50c2eaa
Decode JSON boolean arrays into logical arrays (bug #59135).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28761
diff
changeset
|
364 else |
29994
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
365 { |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
366 NDArray array (array_dims); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
367 |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
368 // Populate the array with specific order to generate MATLAB-identical |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
369 // output. |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
370 octave_idx_type sub_array_numel = array.numel () / cell_numel; |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
371 for (octave_idx_type k = 0; k < cell_numel; ++k) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
372 { |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
373 NDArray sub_array_value = cell(k).array_value (); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
374 for (octave_idx_type i = 0; i < sub_array_numel; ++i) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
375 array(k + i * cell_numel) = sub_array_value(i); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
376 } |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
377 |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
378 if (is_bool) |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
379 return boolNDArray (array); |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
380 else |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
381 return array; |
eb768fc5e6b7
jsondecode.cc: Handle array of arrays and arrays of structs correctly (bug #60688)
Kai T. Ohlhus <k.ohlhus@gmail.com>
parents:
29978
diff
changeset
|
382 } |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
383 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
384 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
385 //! 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
|
386 //! 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
|
387 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
388 //! @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
|
389 //! @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
|
390 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
391 //! @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
|
392 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
393 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
394 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
395 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
396 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
397 //! 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
|
398 //! 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
|
399 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
400 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
401 static 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
|
402 decode_array (const rapidjson::Value& val, |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
403 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
|
404 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
405 // Handle empty arrays |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
406 if (val.Empty ()) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
407 return NDArray (); |
28615
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 // 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
|
410 rapidjson::Type array_type = val[0].GetType (); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
411 // 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
|
412 bool same_type = true; |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
413 bool is_numeric = true; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
414 for (const auto& elem : val.GetArray ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
415 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
416 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
|
417 if (is_numeric && ! (current_elem_type == rapidjson::kNullType |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
418 || current_elem_type == rapidjson::kNumberType)) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
419 is_numeric = false; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
420 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
|
421 // 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
|
422 if (! ((current_elem_type == rapidjson::kTrueType |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
423 && array_type == rapidjson::kFalseType) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
424 || (current_elem_type == rapidjson::kFalseType |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
425 && array_type == rapidjson::kTrueType))) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
426 same_type = false; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
427 } |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
428 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
429 if (is_numeric) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
430 return decode_numeric_array (val); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
431 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
432 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
|
433 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
434 if (array_type == rapidjson::kTrueType |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
435 || array_type == rapidjson::kFalseType) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
436 return decode_boolean_array (val); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
437 else if (array_type == rapidjson::kObjectType) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
438 return decode_object_array (val, options); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
439 else if (array_type == rapidjson::kArrayType) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
440 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
|
441 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
442 error ("jsondecode: unidentified type"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
443 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
444 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
445 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
|
446 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
447 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
448 //! 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
|
449 //! 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
|
450 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
451 //! @param val JSON value. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
452 //! @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
|
453 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
454 //! @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
|
455 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
456 //! @b Example: |
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 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
459 //! rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
460 //! 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
|
461 //! 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
|
462 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
463 |
29995
4628ae890642
move jsondecode functions to octave namespace and make local functions static
John W. Eaton <jwe@octave.org>
parents:
29994
diff
changeset
|
464 static 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
|
465 decode (const rapidjson::Value& val, |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
466 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
|
467 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
468 if (val.IsBool ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
469 return val.GetBool (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
470 else if (val.IsNumber ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
471 return decode_number (val); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
472 else if (val.IsString ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
473 return val.GetString (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
474 else if (val.IsObject ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
475 return decode_object (val, options); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
476 else if (val.IsNull ()) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
477 return NDArray (); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
478 else if (val.IsArray ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
479 return decode_array (val, options); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
480 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
481 error ("jsondecode: unidentified type"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
482 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
483 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
484 #endif |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
485 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
486 DEFUN (jsondecode, args, , |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
487 doc: /* -*- texinfo -*- |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
488 @deftypefn {} {@var{object} =} jsondecode (@var{JSON_txt}) |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
489 @deftypefnx {} {@var{object} =} jsondecode (@dots{}, "ReplacementStyle", @var{rs}) |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
490 @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
|
491 @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
|
492 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
493 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
|
494 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
495 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
|
496 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
497 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
|
498 decoding @var{JSON_txt}. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
499 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
500 For more information about the options @qcode{"ReplacementStyle"} and |
30377
26f2daafa270
doc: Use consistent styling for @ref, @xref, @pxref statements.
Rik <rik@octave.org>
parents:
30355
diff
changeset
|
501 @qcode{"Prefix"}, |
26f2daafa270
doc: Use consistent styling for @ref, @xref, @pxref statements.
Rik <rik@octave.org>
parents:
30355
diff
changeset
|
502 @pxref{XREFmatlab_lang_makeValidName,,@code{matlab.lang.makeValidName}}. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
503 |
30354
c980f938fdd8
doc: grammarcheck C++ files in libinterp/ directory ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29995
diff
changeset
|
504 If the value of the option @qcode{"makeValidName"} is false then names |
29977
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
505 will not be changed by @code{matlab.lang.makeValidName} and the |
30355
6a6efd7bb3ec
doc: grammarcheck texi files of Octave manual ahead of 7.1 release
Rik <rik@octave.org>
parents:
30354
diff
changeset
|
506 @qcode{"ReplacementStyle"} and @qcode{"Prefix"} options will be ignored. |
29977
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
507 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
508 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
|
509 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
|
510 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
511 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
|
512 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
513 @multitable @columnfractions 0.50 0.50 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
514 @headitem JSON data type @tab Octave data type |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
515 @item Boolean @tab scalar logical |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
516 @item Number @tab scalar double |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
517 @item String @tab vector of characters |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
518 @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
|
519 @item null, inside a numeric array @tab @code{NaN} |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
520 @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
|
521 @item Array, of different data types @tab cell array |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
522 @item Array, of Booleans @tab logical array |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
523 @item Array, of Numbers @tab double array |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
524 @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
|
525 @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
|
526 @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
|
527 @end multitable |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
528 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
529 Examples: |
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 @example |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
532 @group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
533 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
|
534 @result{} ans = |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
535 |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
536 1 |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
537 2 |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
538 NaN |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
539 3 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
540 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
541 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
542 @group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
543 jsondecode ('["foo", "bar", ["foo", "bar"]]') |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
544 @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
|
545 @{ |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
546 [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
|
547 [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
|
548 [3,1] = |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
549 @{ |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
550 [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
|
551 [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
|
552 @} |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
553 |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
554 @} |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
555 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
556 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
557 @group |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
558 jsondecode ('@{"nu#m#ber": 7, "s#tr#ing": "hi"@}', ... |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
559 'ReplacementStyle', 'delete') |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
560 @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
|
561 |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
562 number = 7 |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
563 string = hi |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
564 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
565 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
566 @group |
29977
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
567 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
|
568 'makeValidName', false) |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
569 @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
|
570 |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
571 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
|
572 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
|
573 @end group |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
574 |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
575 @group |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
576 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
|
577 @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
|
578 |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
579 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
|
580 m_2 = two |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
581 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
582 @end example |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
583 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
584 @seealso{jsonencode, matlab.lang.makeValidName} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
585 @end deftypefn */) |
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 #if defined (HAVE_RAPIDJSON) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
588 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
589 int nargin = args.length (); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
590 |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
591 // 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
|
592 if (! (nargin % 2)) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
593 print_usage (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
594 |
29977
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
595 // 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
|
596 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
|
597 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
|
598 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
|
599 { |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
600 std::string parameter = args(i).xstring_value ("jsondecode: " |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
601 "option argument must be a string"); |
29977
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
602 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
|
603 { |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
604 use_makeValidName = args(i + 1).xbool_value ("jsondecode: " |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
30377
diff
changeset
|
605 "'makeValidName' value must be a bool"); |
29977
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
606 } |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
607 else |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
608 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
|
609 } |
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
610 |
29978
c7c69808356f
jsondecode.cc: Avoid dereferencing invalid pointer.
Markus Mützel <markus.muetzel@gmx.de>
parents:
29977
diff
changeset
|
611 make_valid_name_options *options |
c7c69808356f
jsondecode.cc: Avoid dereferencing invalid pointer.
Markus Mützel <markus.muetzel@gmx.de>
parents:
29977
diff
changeset
|
612 = use_makeValidName ? new make_valid_name_options (make_valid_name_params) |
c7c69808356f
jsondecode.cc: Avoid dereferencing invalid pointer.
Markus Mützel <markus.muetzel@gmx.de>
parents:
29977
diff
changeset
|
613 : nullptr; |
29977
0d67814eb038
jsondecode.cc: New option "makeValidName" to disable string validation.
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29961
diff
changeset
|
614 |
29978
c7c69808356f
jsondecode.cc: Avoid dereferencing invalid pointer.
Markus Mützel <markus.muetzel@gmx.de>
parents:
29977
diff
changeset
|
615 unwind_action del_opts ([options] (void) { if (options) delete 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
|
616 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
617 if (! args(0).is_string ()) |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
618 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
|
619 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
620 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
|
621 rapidjson::Document d; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
622 // 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
|
623 // 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
|
624 // 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
|
625 // 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
|
626 // types of the elements inside the array. |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
627 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
|
628 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
629 if (d.HasParseError ()) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
630 error ("jsondecode: parse error at offset %u: %s\n", |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
631 static_cast<unsigned int> (d.GetErrorOffset ()) + 1, |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
632 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
|
633 |
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
|
634 return decode (d, options); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
635 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
636 #else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
637 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
638 octave_unused_parameter (args); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
639 |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
640 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
|
641 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
642 #endif |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
643 } |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
644 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
645 /* |
28761
b5461b1dc0ca
Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
646 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
|
647 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
648 ## Input validation tests |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
649 %!testif HAVE_RAPIDJSON |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
650 %! fail ("jsondecode ()"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
651 %! fail ("jsondecode ('1', 2)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
652 %! 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
|
653 %! fail ("jsondecode ('12-')", "parse error at offset 3"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
654 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28626
diff
changeset
|
655 */ |
29958
32c3a5805893
move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29708
diff
changeset
|
656 |
32c3a5805893
move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29708
diff
changeset
|
657 OCTAVE_NAMESPACE_END |