annotate libinterp/corefcn/jsonencode.cc @ 29449:3a680307d4aa

jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259). * libinterp/corefcn/jsonencode.cc: Rename "PrettyWriter" option into "PrettyPrint" and indent with 2 spaces. * test/json/jsonencode_BIST.tst: Update tests to match the changes.
author Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
date Sat, 20 Mar 2021 10:42:06 +0900
parents 7854d5752dd2
children a956ca6698d2
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
1 ////////////////////////////////////////////////////////////////////////
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
2 //
29359
7854d5752dd2 maint: merge stable to default.
John W. Eaton <jwe@octave.org>
parents: 29117
diff changeset
3 // Copyright (C) 2020-2021 The Octave Project Developers
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
4 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
5 // See the file COPYRIGHT.md in the top-level directory of this
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
6 // distribution or <https://octave.org/copyright/>.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
7 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
8 // This file is part of Octave.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
9 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
10 // Octave is free software: you can redistribute it and/or modify it
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
11 // under the terms of the GNU General Public License as published by
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
12 // the Free Software Foundation, either version 3 of the License, or
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
13 // (at your option) any later version.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
14 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
15 // Octave is distributed in the hope that it will be useful, but
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
16 // WITHOUT ANY WARRANTY; without even the implied warranty of
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
18 // GNU General Public License for more details.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
19 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
20 // You should have received a copy of the GNU General Public License
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
21 // along with Octave; see the file COPYING. If not, see
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
22 // <https://www.gnu.org/licenses/>.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
23 //
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
24 ////////////////////////////////////////////////////////////////////////
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
25
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
26 #if defined (HAVE_CONFIG_H)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
27 # include "config.h"
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
28 #endif
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
29
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
30 #include "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 {
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
64 double value = obj.scalar_value ();
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
65
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
66 if (obj.is_bool_scalar ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
67 writer.Bool (obj.bool_value ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
68 // Any numeric input from the interpreter will be in double type so in order
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
69 // to detect ints, we will check if the floor of the input and the input are
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
70 // equal using fabs (A - B) < epsilon method as it is more accurate.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
71 // If value > 999999, MATLAB will encode it in scientific notation (double)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
72 else if (fabs (floor (value) - value) < std::numeric_limits<double>::epsilon ()
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
73 && value <= 999999 && value >= -999999)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
74 writer.Int64 (value);
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
75 // Possibly write NULL for non-finite values (-Inf, Inf, NaN, NA)
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
76 else if (ConvertInfAndNaN && ! octave::math::isfinite (value))
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
77 writer.Null ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
78 else if (obj.is_double_type ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
79 writer.Double (value);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
80 else
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
81 error ("jsonencode: unsupported type");
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
82 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
83
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
84 //! 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
85 //!
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
86 //! @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
87 //! @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
88 //! @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
89 //! @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
90 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
91 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
92 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
93 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
94 //! octave_value obj ("foo");
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
95 //! encode_string (writer, obj, true);
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
96 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
97
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
98 template <typename T> void
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
99 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
100 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
101 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
102 charNDArray array = obj.char_array_value ();
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
103
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
104 if (array.isempty ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
105 writer.String ("");
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
106 else if (array.isvector ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
107 {
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
108 // 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
109 // 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
110 // 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
111 if (level == 0)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
112 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
113 std::string char_vector = "";
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
114 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
115 char_vector += array(i);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
116 writer.String (char_vector.c_str ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
117 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
118 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
119 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
120 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
121 std::string char_vector = "";
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
122 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
123 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
124 writer.String (char_vector.c_str ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
125 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
126 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
127 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
128 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
129 octave_idx_type idx;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
130 octave_idx_type ndims = array.ndims ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
131 dim_vector dims = array.dims ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
132
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
133 // 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
134 // 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
135 if (dims.num_ones () == ndims - 1)
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 // Handle the special case when the input is a vector with more than
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
138 // 2 dimensions (e.g. cat (8, ['a'], ['c'])). In this case, we don't
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
139 // 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
140 if (level != 0)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
141 // Place an opening and a closing bracket (represents a dimension)
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
142 // for every dimension that equals 1 until we reach the 2-D vector
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
143 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
144 writer.StartArray ();
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 encode_string (writer, array.as_row (), original_dims, level);
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 if (level != 0)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
149 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
150 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
151 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
152 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
153 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
154 // 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
155 // 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
156 // the array after encoding it.
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
157 if (original_dims(level) == 1 && level != 1)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
158 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
159 writer.StartArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
160 encode_string (writer, array, original_dims, level + 1);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
161 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
162 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
163 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
164 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
165 // 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
166 // 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
167 // so we replace it with 1
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
168 dims(1) = 1;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
169
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
170 for (idx = 0; idx < ndims; ++idx)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
171 if (dims(idx) != 1)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
172 break;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
173 // 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
174 // 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
175 // in order to encode it recursively.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
176 // 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
177 // higher-dimensional arrays.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
178 RowVector conversion_dims;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
179 conversion_dims.resize (ndims - 1);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
180 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
181 conversion_dims(i) = i + 1;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
182 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
183 conversion_dims(i) = i + 2;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
184
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
185 octave_value_list args (obj);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
186 args.append (conversion_dims);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
187
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
188 Cell sub_arrays = Fnum2cell (args)(0).cell_value ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
189
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
190 writer.StartArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
191
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
192 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
193 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
194 level + 1);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
195
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
196 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
197 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
198 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
199 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
200 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
201
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
202 //! 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
203 //! 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
204 //!
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
205 //! @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
206 //! @param obj struct Octave value.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
207 //! @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
208 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
209 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
210 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
211 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
212 //! octave_value obj (octave_map ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
213 //! encode_struct (writer, obj,true);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
214 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
215
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
216 template <typename T> void
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
217 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
218 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
219 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
220 octave_idx_type numel = struct_array.numel ();
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
221 bool is_array = (numel > 1);
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
222 string_vector keys = struct_array.keys ();
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 if (is_array)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
225 writer.StartArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
226
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
227 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
228 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
229 writer.StartObject ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
230 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
231 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
232 writer.Key (keys(k).c_str ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
233 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
234 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
235 writer.EndObject ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
236 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
237
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
238 if (is_array)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
239 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
240 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
241
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
242 //! 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
243 //!
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
244 //! @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
245 //! @param obj Cell Octave value.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
246 //! @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
247 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
248 //! @b Example:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
249 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
250 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
251 //! octave_value obj (cell ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
252 //! encode_cell (writer, obj,true);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
253 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
254
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
255 template <typename T> void
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
256 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
257 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
258 Cell cell = obj.cell_value ();
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 writer.StartArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
261
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
262 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
263 encode (writer, cell(i), ConvertInfAndNaN);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
264
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
265 writer.EndArray ();
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
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
268 //! 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
269 //!
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
270 //! @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
271 //! @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
272 //! @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
273 //! @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
274 //! @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
275 //! @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
276 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
277 //! @b Example:
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 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
280 //! octave_value obj (NDArray ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
281 //! encode_array (writer, obj,true);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
282 //! @endcode
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 template <typename T> void
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
285 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
286 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
287 bool is_logical = false)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
288 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
289 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
290 // 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
291 // 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
292 if (level == 0)
97d8ef9b7348 From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28850
diff changeset
293 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
294
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
295 if (array.isempty ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
296 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
297 writer.StartArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
298 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
299 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
300 else if (array.isvector ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
301 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
302 writer.StartArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
303 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
304 {
28853
97d8ef9b7348 From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28850
diff changeset
305 if (is_logical)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
306 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
307 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
308 encode_numeric (writer, array(i), ConvertInfAndNaN);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
309 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
310 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
311 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
312 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
313 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
314 octave_idx_type idx;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
315 octave_idx_type ndims = array.ndims ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
316 dim_vector dims = array.dims ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
317
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
318 // 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
319 // 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
320 if (dims.num_ones () == ndims - 1)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
321 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
322 // 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
323 // 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
324 // 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
325 if (level != 0)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
326 // 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
327 // 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
328 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
329 writer.StartArray ();
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 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
332 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
333
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
334 if (level != 0)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
335 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
336 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
337 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
338 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
339 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
340 // 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
341 // 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
342 // the array after encoding it.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
343 if (original_dims (level) == 1)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
344 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
345 writer.StartArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
346 encode_array (writer, array, ConvertInfAndNaN,
28853
97d8ef9b7348 From e2bcb18a88f3075348dd53b5768110d621d8455d Mon Sep 17 00:00:00 2001
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28850
diff changeset
347 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
348 writer.EndArray ();
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 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
351 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
352 for (idx = 0; idx < ndims; ++idx)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
353 if (dims(idx) != 1)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
354 break;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
355
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
356 // 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
357 // 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
358 // in order to encode it recursively.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
359 // 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
360 // higher-dimensional arrays.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
361 RowVector conversion_dims;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
362 conversion_dims.resize (ndims - 1);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
363 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
364 conversion_dims(i) = i + 1;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
365 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
366 conversion_dims(i) = i + 2;
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
367
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
368 octave_value_list args (obj);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
369 args.append (conversion_dims);
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 Cell sub_arrays = Fnum2cell (args)(0).cell_value ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
372
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
373 writer.StartArray ();
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 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
376 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
377 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
378
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
379 writer.EndArray ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
380 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
381 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
382 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
383 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
384
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
385 //! 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
386 //! by choosing which function to call from the previous functions.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
387 //!
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
388 //! @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
389 //! @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
390 //! @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
391 //!
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
392 //! @b Example:
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 //! @code{.cc}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
395 //! octave_value obj (true);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
396 //! encode (writer, obj,true);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
397 //! @endcode
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
398
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
399 template <typename T> void
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
400 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
401 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
402 if (obj.is_real_scalar ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
403 encode_numeric (writer, obj, ConvertInfAndNaN);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
404 // As I checked for scalars, this will detect numeric & logical arrays
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
405 else if (obj.isnumeric () || obj.islogical ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
406 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
407 else if (obj.is_string ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
408 encode_string (writer, obj, obj.dims ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
409 else if (obj.isstruct ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
410 encode_struct (writer, obj, ConvertInfAndNaN);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
411 else if (obj.iscell ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
412 encode_cell (writer, obj, ConvertInfAndNaN);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
413 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
414 // 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
415 // 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
416 // 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
417 // 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
418 // "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
419 {
28800
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
420 octave::unwind_action restore_warning_state
28850
445e5ac1f58d in unwind_action objects, capture variables in lambda expressions when possible
John W. Eaton <jwe@octave.org>
parents: 28800
diff changeset
421 ([] (const octave_value_list& old_warning_state)
28800
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
422 {
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
423 set_warning_state (old_warning_state);
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
424 }, 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
425
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
426 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
427 ConvertInfAndNaN);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
428 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
429 else if (obj.isobject ())
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
430 {
28800
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
431 octave::unwind_action restore_warning_state
28850
445e5ac1f58d in unwind_action objects, capture variables in lambda expressions when possible
John W. Eaton <jwe@octave.org>
parents: 28800
diff changeset
432 ([] (const octave_value_list& old_warning_state)
28800
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
433 {
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
434 set_warning_state (old_warning_state);
d28016d16e9a jsonencode.cc: Use unwind_action rather than unwind_protect for performnace.
Rik <rik@octave.org>
parents: 28761
diff changeset
435 }, 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
436
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
437 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
438 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
439 else
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
440 error ("jsonencode: unsupported type");
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
441 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
442
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
443 #endif
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
444
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
445 DEFUN (jsonencode, args, ,
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
446 doc: /* -*- texinfo -*-
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
447 @deftypefn {} {@var{JSON_txt} =} jsonencode (@var{object})
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
448 @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
449 @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
450
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
451 Encode Octave data types into JSON text.
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
452
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
453 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
454
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
455 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
456 @var{object}.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
457
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
458 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
459 @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
460 @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
461 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
462
29449
3a680307d4aa jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29359
diff changeset
463 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
464 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
465 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
466
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
467 Programming Notes:
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
468
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
469 @itemize @bullet
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
470 @item
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
471 Complex numbers are not supported.
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
472
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
473 @item
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
474 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
475
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
476 @item
29117
10a35049bad7 doc: Cleanup Texinfo macros use in documentation.
Rik <rik@octave.org>
parents: 28853
diff changeset
477 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
478 single-quoted strings.
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
479
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
480 @item
29117
10a35049bad7 doc: Cleanup Texinfo macros use in documentation.
Rik <rik@octave.org>
parents: 28853
diff changeset
481 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
482 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
483
174550af014f document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28624
diff changeset
484 @item
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
485 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
486 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
487
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
488 @item
28753
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
489 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
490 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
491 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
492 @end itemize
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
493
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
494 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
495
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
496 @multitable @columnfractions 0.50 0.50
28753
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
497 @headitem Octave data type @tab JSON data type
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
498 @item logical scalar @tab Boolean
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
499 @item logical vector @tab Array of Boolean, reshaped to row vector
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
500 @item logical array @tab nested Array of Boolean
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
501 @item numeric scalar @tab Number
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
502 @item numeric vector @tab Array of Number, reshaped to row vector
28753
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
503 @item numeric array @tab nested Array of Number
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
504 @item @code{NaN}, @code{NA}, @code{Inf}, @code{-Inf}@*
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
505 when @qcode{"ConvertInfAndNaN" = true} @tab @qcode{"null"}
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
506 @item @code{NaN}, @code{NA}, @code{Inf}, @code{-Inf}@*
28753
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
507 when @qcode{"ConvertInfAndNaN" = false} @tab @qcode{"NaN"}, @qcode{"NaN"},
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
508 @qcode{"Infinity"}, @qcode{"-Infinity"}
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
509 @item empty array @tab @qcode{"[]"}
28753
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
510 @item character vector @tab String
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
511 @item character array @tab Array of String
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
512 @item empty character array @tab @qcode{""}
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
513 @item cell scalar @tab Array
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
514 @item cell vector @tab Array, reshaped to row vector
28753
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
515 @item cell array @tab Array, flattened to row vector
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28751
diff changeset
516 @item struct scalar @tab Object
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
517 @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
518 @item struct array @tab nested Array of Object
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
519 @item classdef object @tab Object
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
520 @end multitable
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
521
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
522 Examples:
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
523
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
524 @example
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
525 @group
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
526 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
527 @result{} [[1,null],[3,4]]
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
528 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
529
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
530 @group
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
531 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
532 @result{} [[1,NaN],[3,4]]
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
533 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
534
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
535 @group
28657
174550af014f document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28624
diff changeset
536 ## 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
537 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
538 @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
539 @end group
174550af014f document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28624
diff changeset
540
174550af014f document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28624
diff changeset
541 @group
174550af014f document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28624
diff changeset
542 ## 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
543 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
544 @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
545 @end group
174550af014f document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28624
diff changeset
546
174550af014f document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28624
diff changeset
547 @group
29449
3a680307d4aa jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29359
diff changeset
548 jsonencode ([true; false], "PrettyPrint", true)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
549 @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
550 true,
3a680307d4aa jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29359
diff changeset
551 false
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
552 ]
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
553 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
554
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
555 @group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
556 jsonencode (['foo', 'bar'; 'foo', 'bar'])
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
557 @result{} ["foobar","foobar"]
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
558 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
559
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
560 @group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
561 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
562 @result{} @{"a":null,"b":[],"c":@{@}@}
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
563 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
564
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
565 @group
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
566 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
567 @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
568 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
569
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
570 @group
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
571 jsonencode (@{'foo'; 'bar'; @{'foo'; 'bar'@}@})
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
572 @result{} ["foo","bar",["foo","bar"]]
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
573 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
574
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
575 @group
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
576 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
577 @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
578 @end group
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
579 @end example
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
580
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
581 @seealso{jsondecode}
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
582 @end deftypefn */)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
583 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
584 #if defined (HAVE_RAPIDJSON)
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
585
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
586 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
587 // jsonencode has two options 'ConvertInfAndNaN' and 'PrettyPrint'
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
588 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
589 print_usage ();
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
590
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
591 // Initialize options with their default values
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
592 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
593 bool PrettyPrint = false;
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
594
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
595 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
596 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
597 if (! args(i).is_string ())
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
598 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
599 if (! args(i+1).is_bool_scalar ())
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
600 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
601
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
602 std::string option_name = args(i++).string_value ();
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
603 if (octave::string::strcmpi (option_name, "ConvertInfAndNaN"))
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
604 ConvertInfAndNaN = args(i).bool_value ();
29449
3a680307d4aa jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29359
diff changeset
605 else if (octave::string::strcmpi (option_name, "PrettyPrint"))
3a680307d4aa jsonencode.cc: Make pretty formating compatible with MATLAB (bug #60259).
Abdallah-Elshamy <abdallah.k.elshamy@gmail.com>
parents: 29359
diff changeset
606 PrettyPrint = args(i).bool_value ();
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
607 else
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
608 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
609 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
610 }
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
611
28751
699bba597610 Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents: 28750
diff changeset
612 # 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
613 if (PrettyPrint)
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
614 {
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
615 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
616 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
617 PrettyPrint = false;
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
618 }
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
619 # endif
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
620
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
621 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
622 if (PrettyPrint)
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
623 {
28751
699bba597610 Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents: 28750
diff changeset
624 # if defined (HAVE_RAPIDJSON_PRETTYWRITER)
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
625 rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::UTF8<>,
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
626 rapidjson::UTF8<>, rapidjson::CrtAllocator,
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
627 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
628 writer.SetIndent (' ', 2);
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
629 encode (writer, args(0), ConvertInfAndNaN);
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
630 # endif
28615
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
631 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
632 else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
633 {
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
634 rapidjson::Writer<rapidjson::StringBuffer, rapidjson::UTF8<>,
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
635 rapidjson::UTF8<>, rapidjson::CrtAllocator,
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
636 rapidjson::kWriteNanAndInfFlag> writer (json);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
637 encode (writer, args(0), ConvertInfAndNaN);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
638 }
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
639
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
640 return octave_value (json.GetString ());
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
641
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
642 #else
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
643
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
644 octave_unused_parameter (args);
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
645
28624
aae9d7f098bd Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents: 28615
diff changeset
646 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
647
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
648 #endif
5da49e37a6c9 New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff changeset
649 }
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
650
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
651 /*
28761
b5461b1dc0ca Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents: 28760
diff changeset
652 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
653
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
654 ## Input validation tests
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
655 %!testif HAVE_RAPIDJSON
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
656 %! fail ("jsonencode ()");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
657 %! fail ("jsonencode (1, 2)");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
658 %! fail ("jsonencode (1, 2, 3, 4)");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
659 %! fail ("jsonencode (1, 2, 3, 4, 5, 6)");
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
660 %! 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
661 %! fail ("jsonencode (1, 'string', ones (2,2))", ...
b5461b1dc0ca Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents: 28760
diff changeset
662 %! "option value must be a logical scalar");
b5461b1dc0ca Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents: 28760
diff changeset
663 %! fail ("jsonencode (1, 'foobar', true)", ...
b5461b1dc0ca Review jsonecode/jsondecode BIST tests.
Rik <rik@octave.org>
parents: 28760
diff changeset
664 %! 'Valid options are "ConvertInfAndNaN"');
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
665
28751
699bba597610 Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents: 28750
diff changeset
666 %!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
667 %! 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
668 %! "warning", 'the "PrettyPrint" option of RapidJSON was unavailable');
28750
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
669
80857685105b Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents: 28657
diff changeset
670 */