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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
1 ////////////////////////////////////////////////////////////////////////
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
2 //
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
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
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
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
519 @headitem Octave data type @tab JSON data type
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
520 @item logical scalar @tab Boolean
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
521 @item logical vector @tab Array of Boolean, reshaped to row vector
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
522 @item logical array @tab nested Array of Boolean
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
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
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
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
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
529 when @qcode{"ConvertInfAndNaN" = false} @tab @qcode{"NaN"}, @qcode{"NaN"},
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
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
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
532 @item character vector @tab String
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
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
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
537 @item cell array @tab Array, flattened to row vector
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
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)