Mercurial > octave
annotate libinterp/corefcn/jsonencode.cc @ 33617:ec2635a02328 bytecode-interpreter tip
maint: Merge default to bytecode-interpreter.
author | Markus Mützel <markus.muetzel@gmx.de> |
---|---|
date | Tue, 21 May 2024 18:29:03 +0200 |
parents | 9f97974976cd |
children |
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 // |
32632
2e484f9f1f18
maint: update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents:
31721
diff
changeset
|
3 // Copyright (C) 2020-2024 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 "builtin-defun-decls.h" |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
31 #include "defun.h" |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
32 #include "error.h" |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
33 #include "errwarn.h" |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
34 #include "oct-string.h" |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
35 #include "ovl.h" |
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/stringbuffer.h> |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
39 # include <rapidjson/writer.h> |
28751
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
40 # if defined (HAVE_RAPIDJSON_PRETTYWRITER) |
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
41 # include <rapidjson/prettywriter.h> |
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
42 # endif |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
43 #endif |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
44 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
45 #if defined (HAVE_RAPIDJSON) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
46 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
47 //! Encodes a scalar Octave value into a numerical JSON value. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
48 //! |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
49 //! @param writer RapidJSON's writer that is responsible for generating JSON. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
50 //! @param obj scalar Octave value. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
51 //! @param ConvertInfAndNaN @c bool that converts @c Inf and @c NaN to @c null. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
52 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
53 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
54 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
55 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
56 //! octave_value obj (7); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
57 //! encode_numeric (writer, obj, true); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
58 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
59 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
60 template <typename T> void |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
61 encode_numeric (T& writer, const octave_value& obj, |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
62 const bool& ConvertInfAndNaN) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
63 { |
32524
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
64 if (obj.isfloat ()) |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
65 { |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
66 double value = obj.scalar_value (); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
67 |
33200
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
68 // Detect floating point numbers which are actually integers by checking |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
69 // whether the number and the integer portion of the number are the same |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
70 // to within eps. |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
71 // FIXME: If value > 999999, MATLAB will encode it in scientific |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
72 // notation, but rapidJSON will output all digits. |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
73 if (fabs (trunc (value) - value) < std::numeric_limits<double>::epsilon ()) |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
74 |
32524
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
75 writer.Int64 (value); |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
76 // Possibly write NULL for non-finite values (-Inf, Inf, NaN, NA) |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
77 else if (ConvertInfAndNaN && ! octave::math::isfinite (value)) |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
78 writer.Null (); |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
79 else |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
80 writer.Double (value); |
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
81 } |
33200
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
82 else if (obj.isinteger ()) |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
83 { |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
84 if (obj.is_uint64_type ()) |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
85 { |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
86 uint64_t value = obj.uint64_value (); |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
87 writer.Uint64 (value); |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
88 } |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
89 else |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
90 { |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
91 // Write all other integers as 64-bit values and let RapidJSON |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
92 // determine number of digits to keep. |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
93 int64_t value = obj.int64_value (); |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
94 writer.Int64 (value); |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
95 } |
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
96 } |
32524
d2eabc48cf80
maint: code cleanup in jsonencode.cc
Rik <rik@octave.org>
parents:
32523
diff
changeset
|
97 else if (obj.is_bool_scalar ()) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
98 writer.Bool (obj.bool_value ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
99 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
100 error ("jsonencode: unsupported type"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
101 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
102 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
103 //! Encodes character vectors and arrays into JSON strings. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
104 //! |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
105 //! @param writer RapidJSON's writer that is responsible for generating JSON. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
106 //! @param obj character vectors or character arrays. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
107 //! @param original_dims The original dimensions of the array being encoded. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
108 //! @param level The level of recursion for the function. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
109 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
110 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
111 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
112 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
113 //! octave_value obj ("foo"); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
114 //! encode_string (writer, obj, true); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
115 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
116 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
117 template <typename T> void |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
118 encode_string (T& writer, const octave_value& obj, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
119 const dim_vector& original_dims, int level = 0) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
120 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
121 charNDArray array = obj.char_array_value (); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
122 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
123 if (array.isempty ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
124 writer.String (""); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
125 else if (array.isvector ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
126 { |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
127 // Handle the special case where the input is a vector with more than |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
128 // 2 dimensions (e.g. cat (8, ['a'], ['c'])). In this case, we don't |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
129 // split the inner vectors of the input; we merge them into one. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
130 if (level == 0) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
131 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
132 std::string char_vector = ""; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
133 for (octave_idx_type i = 0; i < array.numel (); ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
134 char_vector += array(i); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
135 writer.String (char_vector.c_str ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
136 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
137 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
138 for (octave_idx_type i = 0; i < array.numel () / original_dims(1); ++i) |
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 std::string char_vector = ""; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
141 for (octave_idx_type k = 0; k < original_dims(1); ++k) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
142 char_vector += array(i * original_dims(1) + k); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
143 writer.String (char_vector.c_str ()); |
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 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
146 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
147 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
148 octave_idx_type idx; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
149 octave_idx_type ndims = array.ndims (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
150 dim_vector dims = array.dims (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
151 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
152 // In this case, we already have a vector. So, we transform it to 2-D |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
153 // vector in order to be detected by "isvector" in the recursive call |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
154 if (dims.num_ones () == ndims - 1) |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
155 { |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
156 // Handle the special case when the input is a vector with more than |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
157 // 2 dimensions (e.g. cat (8, ['a'], ['c'])). In this case, we don't |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
158 // add dimension brackets and treat it as if it is a vector |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
159 if (level != 0) |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
160 // Place an opening and a closing bracket (represents a dimension) |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
161 // for every dimension that equals 1 until we reach the 2-D vector |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
162 for (int i = level; i < ndims - 1; ++i) |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
163 writer.StartArray (); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
164 |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
165 encode_string (writer, array.as_row (), original_dims, level); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
166 |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
167 if (level != 0) |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
168 for (int i = level; i < ndims - 1; ++i) |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
169 writer.EndArray (); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
170 } |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
171 else |
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 // We place an opening and a closing bracket for each dimension |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
174 // that equals 1 to preserve the number of dimensions when decoding |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
175 // the array after encoding it. |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
176 if (original_dims(level) == 1 && level != 1) |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
177 { |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
178 writer.StartArray (); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
179 encode_string (writer, array, original_dims, level + 1); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
180 writer.EndArray (); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
181 } |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
182 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
183 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
184 // The second dimension contains the number of the chars in |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
185 // the char vector. We want to treat them as a one object, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
186 // so we replace it with 1 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
187 dims(1) = 1; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
188 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
189 for (idx = 0; idx < ndims; ++idx) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
190 if (dims(idx) != 1) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
191 break; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
192 // Create the dimensions that will be used to call "num2cell" |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
193 // We called "num2cell" to divide the array to smaller sub-arrays |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
194 // in order to encode it recursively. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
195 // The recursive encoding is necessary to support encoding of |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
196 // higher-dimensional arrays. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
197 RowVector conversion_dims; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
198 conversion_dims.resize (ndims - 1); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
199 for (octave_idx_type i = 0; i < idx; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
200 conversion_dims(i) = i + 1; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
201 for (octave_idx_type i = idx ; i < ndims - 1; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
202 conversion_dims(i) = i + 2; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
203 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
204 octave_value_list args (obj); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
205 args.append (conversion_dims); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
206 |
29958
32c3a5805893
move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29956
diff
changeset
|
207 Cell sub_arrays = octave::Fnum2cell (args)(0).cell_value (); |
28615
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 writer.StartArray (); |
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 for (octave_idx_type i = 0; i < sub_arrays.numel (); ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
212 encode_string (writer, sub_arrays(i), original_dims, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
213 level + 1); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
214 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
215 writer.EndArray (); |
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 } |
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 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
220 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
221 //! Encodes a struct Octave value into a JSON object or a JSON array depending |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
222 //! on the type of the struct (scalar struct or struct array.) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
223 //! |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
224 //! @param writer RapidJSON's writer that is responsible for generating JSON. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
225 //! @param obj struct Octave value. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
226 //! @param ConvertInfAndNaN @c bool that converts @c Inf and @c NaN to @c null. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
227 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
228 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
229 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
230 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
231 //! octave_value obj (octave_map ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
232 //! encode_struct (writer, obj,true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
233 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
234 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
235 template <typename T> void |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
236 encode_struct (T& writer, const octave_value& obj, const bool& ConvertInfAndNaN) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
237 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
238 octave_map struct_array = obj.map_value (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
239 octave_idx_type numel = struct_array.numel (); |
31721
b4bde1e47dde
Fix segfault when using jsonencode on empty struct arrays (bug #63622)
Rik <rik@octave.org>
parents:
31706
diff
changeset
|
240 bool is_array = (numel != 1); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
241 string_vector keys = struct_array.keys (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
242 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
243 if (is_array) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
244 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
245 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
246 for (octave_idx_type i = 0; i < numel; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
247 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
248 writer.StartObject (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
249 for (octave_idx_type k = 0; k < keys.numel (); ++k) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
250 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
251 writer.Key (keys(k).c_str ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
252 encode (writer, struct_array(i).getfield (keys(k)), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
253 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
254 writer.EndObject (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
255 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
256 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
257 if (is_array) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
258 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
259 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
260 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
261 //! Encodes a Cell Octave value into a JSON array |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
262 //! |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
263 //! @param writer RapidJSON's writer that is responsible for generating JSON. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
264 //! @param obj Cell Octave value. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
265 //! @param ConvertInfAndNaN @c bool that converts @c Inf and @c NaN to @c null. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
266 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
267 //! @b Example: |
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 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
270 //! octave_value obj (cell ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
271 //! encode_cell (writer, obj,true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
272 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
273 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
274 template <typename T> void |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
275 encode_cell (T& writer, const octave_value& obj, const bool& ConvertInfAndNaN) |
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 Cell cell = obj.cell_value (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
278 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
279 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
280 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
281 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
|
282 encode (writer, cell(i), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
283 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
284 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
285 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
286 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
287 //! Encodes a numeric or logical Octave array into a JSON array |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
288 //! |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
289 //! @param writer RapidJSON's writer that is responsible for generating JSON. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
290 //! @param obj numeric or logical Octave array. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
291 //! @param ConvertInfAndNaN @c bool that converts @c Inf and @c NaN to @c null. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
292 //! @param original_dims The original dimensions of the array being encoded. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
293 //! @param level The level of recursion for the function. |
28853
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
294 //! @param is_logical optional @c bool that indicates if the array is logical. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
295 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
296 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
297 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
298 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
299 //! octave_value obj (NDArray ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
300 //! encode_array (writer, obj,true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
301 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
302 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
303 template <typename T> void |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
304 encode_array (T& writer, const octave_value& obj, const bool& ConvertInfAndNaN, |
28853
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
305 const dim_vector& original_dims, int level = 0, |
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
306 bool is_logical = false) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
307 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
308 NDArray array = obj.array_value (); |
28853
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
309 // is_logical is assigned at level 0. I think this is better than changing |
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
310 // many places in the code, and it makes the function more modular. |
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
311 if (level == 0) |
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
312 is_logical = obj.islogical (); |
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
313 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
314 if (array.isempty ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
315 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
316 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
317 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
318 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
319 else if (array.isvector ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
320 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
321 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
322 for (octave_idx_type i = 0; i < array.numel (); ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
323 { |
28853
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
324 if (is_logical) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
325 encode_numeric (writer, bool (array(i)), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
326 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
327 encode_numeric (writer, array(i), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
328 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
329 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
330 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
331 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
332 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
333 octave_idx_type idx; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
334 octave_idx_type ndims = array.ndims (); |
32598
2f3b54f81947
avoid dim_vector copies in more places where possible (bug #64962)
John W. Eaton <jwe@octave.org>
parents:
32524
diff
changeset
|
335 const dim_vector& dims = array.dims (); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
336 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
337 // In this case, we already have a vector. So, we transform it to 2-D |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
338 // vector in order to be detected by "isvector" in the recursive call |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
339 if (dims.num_ones () == ndims - 1) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
340 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
341 // Handle the special case when the input is a vector with more than |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
342 // 2 dimensions (e.g. ones ([1 1 1 1 1 6])). In this case, we don't |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
343 // add dimension brackets and treat it as if it is a vector |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
344 if (level != 0) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
345 // Place an opening and a closing bracket (represents a dimension) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
346 // for every dimension that equals 1 till we reach the 2-D vector |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
347 for (int i = level; i < ndims - 1; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
348 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
349 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
350 encode_array (writer, array.as_row (), ConvertInfAndNaN, |
28853
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
351 original_dims, level + 1, is_logical); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
352 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
353 if (level != 0) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
354 for (int i = level; i < ndims - 1; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
355 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
356 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
357 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
358 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
359 // We place an opening and a closing bracket for each dimension |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
360 // that equals 1 to preserve the number of dimensions when decoding |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
361 // the array after encoding it. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
362 if (original_dims (level) == 1) |
30390
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
363 { |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
364 writer.StartArray (); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
365 encode_array (writer, array, ConvertInfAndNaN, |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
366 original_dims, level + 1, is_logical); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
367 writer.EndArray (); |
a61e1a0f6024
maint: style check C++ files in libinterp/ ahead of 7.1 release.
Rik <rik@octave.org>
parents:
29961
diff
changeset
|
368 } |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
369 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
370 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
371 for (idx = 0; idx < ndims; ++idx) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
372 if (dims(idx) != 1) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
373 break; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
374 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
375 // Create the dimensions that will be used to call "num2cell" |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
376 // We called "num2cell" to divide the array to smaller sub-arrays |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
377 // in order to encode it recursively. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
378 // The recursive encoding is necessary to support encoding of |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
379 // higher-dimensional arrays. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
380 RowVector conversion_dims; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
381 conversion_dims.resize (ndims - 1); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
382 for (octave_idx_type i = 0; i < idx; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
383 conversion_dims(i) = i + 1; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
384 for (octave_idx_type i = idx ; i < ndims - 1; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
385 conversion_dims(i) = i + 2; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
386 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
387 octave_value_list args (obj); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
388 args.append (conversion_dims); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
389 |
29958
32c3a5805893
move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29956
diff
changeset
|
390 Cell sub_arrays = octave::Fnum2cell (args)(0).cell_value (); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
391 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
392 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
393 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
394 for (octave_idx_type i = 0; i < sub_arrays.numel (); ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
395 encode_array (writer, sub_arrays(i), ConvertInfAndNaN, |
28853
97d8ef9b7348
From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28850
diff
changeset
|
396 original_dims, level + 1, is_logical); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
397 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
398 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
399 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
400 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
401 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
402 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
403 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
404 //! Encodes any Octave object. This function only serves as an interface |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
405 //! 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
|
406 //! |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
407 //! @param writer RapidJSON's writer that is responsible for generating JSON. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
408 //! @param obj any @ref octave_value that is supported. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
409 //! @param ConvertInfAndNaN @c bool that converts @c Inf and @c NaN to @c null. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
410 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
411 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
412 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
413 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
414 //! octave_value obj (true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
415 //! encode (writer, obj,true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
416 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
417 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
418 template <typename T> void |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
419 encode (T& writer, const octave_value& obj, const bool& ConvertInfAndNaN) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
420 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
421 if (obj.is_real_scalar ()) |
33200
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
422 // Numeric scalars. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
423 encode_numeric (writer, obj, ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
424 else if (obj.isnumeric () || obj.islogical ()) |
33200
9f97974976cd
Allow integer inputs greater than 999999 to jsonencode (bug #65447)
Rik <rik@octave.org>
parents:
32633
diff
changeset
|
425 // Numeric and logical arrays. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
426 encode_array (writer, obj, ConvertInfAndNaN, obj.dims ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
427 else if (obj.is_string ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
428 encode_string (writer, obj, obj.dims ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
429 else if (obj.isstruct ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
430 encode_struct (writer, obj, ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
431 else if (obj.iscell ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
432 encode_cell (writer, obj, ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
433 else if (obj.class_name () == "containers.Map") |
28759
b6bed53f059f
Reset the warning state after changing it locally in jsonencode (bug #59122).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28753
diff
changeset
|
434 // To extract the data in containers.Map, convert it to a struct. |
b6bed53f059f
Reset the warning state after changing it locally in jsonencode (bug #59122).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28753
diff
changeset
|
435 // The struct will have a "map" field whose value is a struct that |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
436 // contains the desired data. |
28759
b6bed53f059f
Reset the warning state after changing it locally in jsonencode (bug #59122).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28753
diff
changeset
|
437 // To avoid warnings due to that conversion, disable the |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
438 // "Octave:classdef-to-struct" warning and re-enable it. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
439 { |
28800
d28016d16e9a
jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents:
28761
diff
changeset
|
440 octave::unwind_action restore_warning_state |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
441 ([] (const octave_value_list& old_warning_state) |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
442 { |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
443 octave::set_warning_state (old_warning_state); |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
444 }, octave::set_warning_state ("Octave:classdef-to-struct", "off")); |
28759
b6bed53f059f
Reset the warning state after changing it locally in jsonencode (bug #59122).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28753
diff
changeset
|
445 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
446 encode_struct (writer, obj.scalar_map_value ().getfield ("map"), |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
447 ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
448 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
449 else if (obj.isobject ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
450 { |
28800
d28016d16e9a
jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents:
28761
diff
changeset
|
451 octave::unwind_action restore_warning_state |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
452 ([] (const octave_value_list& old_warning_state) |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
453 { |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
454 octave::set_warning_state (old_warning_state); |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
455 }, octave::set_warning_state ("Octave:classdef-to-struct", "off")); |
28759
b6bed53f059f
Reset the warning state after changing it locally in jsonencode (bug #59122).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28753
diff
changeset
|
456 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
457 encode_struct (writer, obj.scalar_map_value (), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
458 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
459 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
460 error ("jsonencode: unsupported type"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
461 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
462 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
463 #endif |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
464 |
31605
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
465 OCTAVE_BEGIN_NAMESPACE(octave) |
29958
32c3a5805893
move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29956
diff
changeset
|
466 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
467 DEFUN (jsonencode, args, , |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
468 doc: /* -*- texinfo -*- |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
469 @deftypefn {} {@var{JSON_txt} =} jsonencode (@var{object}) |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
470 @deftypefnx {} {@var{JSON_txt} =} jsonencode (@dots{}, "ConvertInfAndNaN", @var{TF}) |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
471 @deftypefnx {} {@var{JSON_txt} =} jsonencode (@dots{}, "PrettyPrint", @var{TF}) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
472 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
473 Encode Octave data types into JSON text. |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
474 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
475 The input @var{object} is an Octave variable to encode. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
476 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
477 The output @var{JSON_txt} is the JSON text that contains the result of encoding |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
478 @var{object}. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
479 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
480 If the value of the option @qcode{"ConvertInfAndNaN"} is true then @code{NaN}, |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
481 @code{NA}, @code{-Inf}, and @code{Inf} values will be converted to |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
482 @qcode{"null"} in the output. If it is false then they will remain as their |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
483 original values. The default value for this option is true. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
484 |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
485 If the value of the option @qcode{"PrettyPrint"} is true, the output text will |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
486 have indentations and line feeds. If it is false, the output will be condensed |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
487 and written without whitespace. The default value for this option is false. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
488 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
489 Programming Notes: |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
490 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
491 @itemize @bullet |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
492 @item |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
493 Complex numbers are not supported. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
494 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
495 @item |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
496 classdef objects are first converted to structs and then encoded. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
497 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
498 @item |
29117
10a35049bad7
doc: Cleanup Texinfo macros use in documentation.
Rik <rik@octave.org>
parents:
28853
diff
changeset
|
499 To preserve escape characters (e.g., @qcode{"@backslashchar{}n"}), use |
10a35049bad7
doc: Cleanup Texinfo macros use in documentation.
Rik <rik@octave.org>
parents:
28853
diff
changeset
|
500 single-quoted strings. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
501 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
502 @item |
29117
10a35049bad7
doc: Cleanup Texinfo macros use in documentation.
Rik <rik@octave.org>
parents:
28853
diff
changeset
|
503 Every character after the null character (@qcode{"@backslashchar{}0"}) in a |
10a35049bad7
doc: Cleanup Texinfo macros use in documentation.
Rik <rik@octave.org>
parents:
28853
diff
changeset
|
504 double-quoted string will be dropped during encoding. |
28657
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
505 |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
506 @item |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
507 Encoding and decoding an array is not guaranteed to preserve the dimensions |
28761
b5461b1dc0ca
Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents:
28760
diff
changeset
|
508 of the array. In particular, row vectors will be reshaped to column vectors. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
509 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
510 @item |
28753 | 511 Encoding and decoding is not guaranteed to preserve the Octave data type |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
512 because JSON supports fewer data types than Octave. For example, if you |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
513 encode an @code{int8} and then decode it, you will get a @code{double}. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
514 @end itemize |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
515 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
516 This table shows the conversions from Octave data types to JSON data types: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
517 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
518 @multitable @columnfractions 0.50 0.50 |
28753 | 519 @headitem Octave data type @tab JSON data type |
520 @item logical scalar @tab Boolean | |
521 @item logical vector @tab Array of Boolean, reshaped to row vector | |
522 @item logical array @tab nested Array of Boolean | |
523 @item numeric scalar @tab Number | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
524 @item numeric vector @tab Array of Number, reshaped to row vector |
28753 | 525 @item numeric array @tab nested Array of Number |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
526 @item @code{NaN}, @code{NA}, @code{Inf}, @code{-Inf}@* |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
527 when @qcode{"ConvertInfAndNaN" = true} @tab @qcode{"null"} |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
528 @item @code{NaN}, @code{NA}, @code{Inf}, @code{-Inf}@* |
28753 | 529 when @qcode{"ConvertInfAndNaN" = false} @tab @qcode{"NaN"}, @qcode{"NaN"}, |
530 @qcode{"Infinity"}, @qcode{"-Infinity"} | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
531 @item empty array @tab @qcode{"[]"} |
28753 | 532 @item character vector @tab String |
533 @item character array @tab Array of String | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
534 @item empty character array @tab @qcode{""} |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
535 @item cell scalar @tab Array |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
536 @item cell vector @tab Array, reshaped to row vector |
28753 | 537 @item cell array @tab Array, flattened to row vector |
538 @item struct scalar @tab Object | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
539 @item struct vector @tab Array of Object, reshaped to row vector |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
540 @item struct array @tab nested Array of Object |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
541 @item classdef object @tab Object |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
542 @end multitable |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
543 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
544 Examples: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
545 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
546 @example |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
547 @group |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
548 jsonencode ([1, NaN; 3, 4]) |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
549 @result{} [[1,null],[3,4]] |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
550 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
551 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
552 @group |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
553 jsonencode ([1, NaN; 3, 4], "ConvertInfAndNaN", false) |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
554 @result{} [[1,NaN],[3,4]] |
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 |
28657
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
558 ## Escape characters inside a single-quoted string |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
559 jsonencode ('\0\a\b\t\n\v\f\r') |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
560 @result{} "\\0\\a\\b\\t\\n\\v\\f\\r" |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
561 @end group |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
562 |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
563 @group |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
564 ## Escape characters inside a double-quoted string |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
565 jsonencode ("\a\b\t\n\v\f\r") |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
566 @result{} "\u0007\b\t\n\u000B\f\r" |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
567 @end group |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
568 |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
569 @group |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
570 jsonencode ([true; false], "PrettyPrint", true) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
571 @result{} ans = [ |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
572 true, |
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
573 false |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
574 ] |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
575 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
576 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
577 @group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
578 jsonencode (['foo', 'bar'; 'foo', 'bar']) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
579 @result{} ["foobar","foobar"] |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
580 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
581 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
582 @group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
583 jsonencode (struct ('a', Inf, 'b', [], 'c', struct ())) |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
584 @result{} @{"a":null,"b":[],"c":@{@}@} |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
585 @end group |
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 @group |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
588 jsonencode (struct ('structarray', struct ('a', @{1; 3@}, 'b', @{2; 4@}))) |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
589 @result{} @{"structarray":[@{"a":1,"b":2@},@{"a":3,"b":4@}]@} |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
590 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
591 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
592 @group |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
593 jsonencode (@{'foo'; 'bar'; @{'foo'; 'bar'@}@}) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
594 @result{} ["foo","bar",["foo","bar"]] |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
595 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
596 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
597 @group |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
598 jsonencode (containers.Map(@{'foo'; 'bar'; 'baz'@}, [1, 2, 3])) |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
599 @result{} @{"bar":2,"baz":3,"foo":1@} |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
600 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
601 @end example |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
602 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
603 @seealso{jsondecode} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
604 @end deftypefn */) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
605 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
606 #if defined (HAVE_RAPIDJSON) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
607 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
608 int nargin = args.length (); |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
609 // jsonencode has two options 'ConvertInfAndNaN' and 'PrettyPrint' |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
610 if (nargin != 1 && nargin != 3 && nargin != 5) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
611 print_usage (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
612 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
613 // Initialize options with their default values |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
614 bool ConvertInfAndNaN = true; |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
615 bool PrettyPrint = false; |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
616 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
617 for (octave_idx_type i = 1; i < nargin; ++i) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
618 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
619 if (! args(i).is_string ()) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
620 error ("jsonencode: option must be a string"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
621 if (! args(i+1).is_bool_scalar ()) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
622 error ("jsonencode: option value must be a logical scalar"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
623 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
624 std::string option_name = args(i++).string_value (); |
29961
7d6709900da7
eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents:
29958
diff
changeset
|
625 if (string::strcmpi (option_name, "ConvertInfAndNaN")) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
626 ConvertInfAndNaN = args(i).bool_value (); |
29961
7d6709900da7
eliminate octave:: namespace tags in DEFUN and DEFMETHOD and more
John W. Eaton <jwe@octave.org>
parents:
29958
diff
changeset
|
627 else if (string::strcmpi (option_name, "PrettyPrint")) |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
628 PrettyPrint = args(i).bool_value (); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
629 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
630 error ("jsonencode: " |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
631 R"(Valid options are "ConvertInfAndNaN" and "PrettyPrint")"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
632 } |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
633 |
28751
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
634 # if ! defined (HAVE_RAPIDJSON_PRETTYWRITER) |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
635 if (PrettyPrint) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
636 { |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
637 warn_disabled_feature ("jsonencode", |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
638 R"(the "PrettyPrint" option of RapidJSON)"); |
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
639 PrettyPrint = false; |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
640 } |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
641 # endif |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
642 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
643 rapidjson::StringBuffer json; |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
644 if (PrettyPrint) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
645 { |
28751
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
646 # if defined (HAVE_RAPIDJSON_PRETTYWRITER) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
647 rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::UTF8<>, |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
648 rapidjson::UTF8<>, rapidjson::CrtAllocator, |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
649 rapidjson::kWriteNanAndInfFlag> writer (json); |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
650 writer.SetIndent (' ', 2); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
651 encode (writer, args(0), ConvertInfAndNaN); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
652 # endif |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
653 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
654 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
655 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
656 rapidjson::Writer<rapidjson::StringBuffer, rapidjson::UTF8<>, |
31607
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
657 rapidjson::UTF8<>, rapidjson::CrtAllocator, |
aac27ad79be6
maint: Re-indent code after switch to using namespace macros.
Rik <rik@octave.org>
parents:
31605
diff
changeset
|
658 rapidjson::kWriteNanAndInfFlag> writer (json); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
659 encode (writer, args(0), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
660 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
661 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
662 return octave_value (json.GetString ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
663 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
664 #else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
665 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
666 octave_unused_parameter (args); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
667 |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
668 err_disabled_feature ("jsonencode", "JSON encoding through RapidJSON"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
669 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
670 #endif |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
671 } |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
672 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
673 /* |
28761
b5461b1dc0ca
Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents:
28760
diff
changeset
|
674 Functional BIST tests are located in test/json/jsonencode_BIST.tst |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
675 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
676 ## Input validation tests |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
677 %!testif HAVE_RAPIDJSON |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
678 %! fail ("jsonencode ()"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
679 %! fail ("jsonencode (1, 2)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
680 %! fail ("jsonencode (1, 2, 3, 4)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
681 %! fail ("jsonencode (1, 2, 3, 4, 5, 6)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
682 %! fail ("jsonencode (1, 2, true)", "option must be a string"); |
28761
b5461b1dc0ca
Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents:
28760
diff
changeset
|
683 %! fail ("jsonencode (1, 'string', ones (2,2))", ... |
b5461b1dc0ca
Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents:
28760
diff
changeset
|
684 %! "option value must be a logical scalar"); |
b5461b1dc0ca
Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents:
28760
diff
changeset
|
685 %! fail ("jsonencode (1, 'foobar', true)", ... |
b5461b1dc0ca
Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents:
28760
diff
changeset
|
686 %! 'Valid options are "ConvertInfAndNaN"'); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
687 |
28751
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
688 %!testif HAVE_RAPIDJSON; ! __have_feature__ ("RAPIDJSON_PRETTYWRITER") |
29449
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
689 %! fail ("jsonencode (1, 'PrettyPrint', true)", ... |
3a680307d4aa
jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents:
29359
diff
changeset
|
690 %! "warning", 'the "PrettyPrint" option of RapidJSON was unavailable'); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
691 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
692 */ |
29958
32c3a5805893
move DEFUN and DEFMETHOD functions inside octave namespace
John W. Eaton <jwe@octave.org>
parents:
29956
diff
changeset
|
693 |
31605
e88a07dec498
maint: Use macros to begin/end C++ namespaces.
Rik <rik@octave.org>
parents:
30564
diff
changeset
|
694 OCTAVE_END_NAMESPACE(octave) |