Mercurial > octave
annotate libinterp/corefcn/jsonencode.cc @ 28760:f4ed4be5d809
Use lambda expression instead of file static one-line function in cset b6bed53f059f.
* jsonencode.cc: Use C++ lambda expression instead of declaring a file static
one-line function.
author | Rik <rik@octave.org> |
---|---|
date | Fri, 18 Sep 2020 11:58:38 -0700 |
parents | b6bed53f059f |
children | b5461b1dc0ca |
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 // |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
3 // Copyright (C) 2020 The Octave Project Developers |
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. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
275 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
276 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
277 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
278 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
279 //! octave_value obj (NDArray ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
280 //! encode_array (writer, obj,true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
281 //! @endcode |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
282 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
283 template <typename T> void |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
284 encode_array (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
|
285 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
|
286 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
287 NDArray array = obj.array_value (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
288 if (array.isempty ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
289 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
290 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
291 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
292 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
293 else if (array.isvector ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
294 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
295 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
296 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
|
297 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
298 if (obj.islogical ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
299 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
|
300 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
301 encode_numeric (writer, array(i), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
302 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
303 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
304 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
305 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
306 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
307 octave_idx_type idx; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
308 octave_idx_type ndims = array.ndims (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
309 dim_vector dims = array.dims (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
310 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
311 // 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
|
312 // 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
|
313 if (dims.num_ones () == ndims - 1) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
314 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
315 // 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
|
316 // 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
|
317 // 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
|
318 if (level != 0) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
319 // 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
|
320 // 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
|
321 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
|
322 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
323 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
324 encode_array (writer, array.as_row (), ConvertInfAndNaN, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
325 original_dims); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
326 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
327 if (level != 0) |
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.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
330 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
331 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
332 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
333 // 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
|
334 // 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
|
335 // the array after encoding it. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
336 if (original_dims (level) == 1) |
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 writer.StartArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
339 encode_array (writer, array, ConvertInfAndNaN, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
340 original_dims, level + 1); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
341 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
342 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
343 else |
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 for (idx = 0; idx < ndims; ++idx) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
346 if (dims(idx) != 1) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
347 break; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
348 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
349 // 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
|
350 // 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
|
351 // in order to encode it recursively. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
352 // 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
|
353 // higher-dimensional arrays. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
354 RowVector conversion_dims; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
355 conversion_dims.resize (ndims - 1); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
356 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
|
357 conversion_dims(i) = i + 1; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
358 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
|
359 conversion_dims(i) = i + 2; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
360 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
361 octave_value_list args (obj); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
362 args.append (conversion_dims); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
363 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
364 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
|
365 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
366 writer.StartArray (); |
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 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
|
369 encode_array (writer, sub_arrays(i), ConvertInfAndNaN, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
370 original_dims, level + 1); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
371 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
372 writer.EndArray (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
373 } |
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 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
376 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
377 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
378 //! 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
|
379 //! 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
|
380 //! |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
381 //! @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
|
382 //! @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
|
383 //! @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
|
384 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
385 //! @b Example: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
386 //! |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
387 //! @code{.cc} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
388 //! octave_value obj (true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
389 //! encode (writer, obj,true); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
390 //! @endcode |
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 template <typename T> void |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
393 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
|
394 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
395 if (obj.is_real_scalar ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
396 encode_numeric (writer, obj, ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
397 // 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
|
398 else if (obj.isnumeric () || obj.islogical ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
399 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
|
400 else if (obj.is_string ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
401 encode_string (writer, obj, obj.dims ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
402 else if (obj.isstruct ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
403 encode_struct (writer, obj, ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
404 else if (obj.iscell ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
405 encode_cell (writer, obj, ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
406 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
|
407 // 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
|
408 // 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
|
409 // 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
|
410 // 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
|
411 // "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
|
412 { |
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
|
413 octave_value_list ws |
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 = set_warning_state ("Octave:classdef-to-struct", "off"); |
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 octave::unwind_protect frame; |
28760
f4ed4be5d809
Use lambda expression instead of file static one-line function in cset b6bed53f059f.
Rik <rik@octave.org>
parents:
28759
diff
changeset
|
416 auto cleanup_ptr = +[] (octave_value_list ws_orig) |
f4ed4be5d809
Use lambda expression instead of file static one-line function in cset b6bed53f059f.
Rik <rik@octave.org>
parents:
28759
diff
changeset
|
417 { set_warning_state (ws_orig); } ; |
f4ed4be5d809
Use lambda expression instead of file static one-line function in cset b6bed53f059f.
Rik <rik@octave.org>
parents:
28759
diff
changeset
|
418 frame.add_fcn (cleanup_ptr, ws); |
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
|
419 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
420 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
|
421 ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
422 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
423 else if (obj.isobject ()) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
424 { |
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 octave_value_list ws |
b6bed53f059f
Reset the warning state after changing it locally in jsonencode (bug #59122).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28753
diff
changeset
|
426 = set_warning_state ("Octave:classdef-to-struct", "off"); |
b6bed53f059f
Reset the warning state after changing it locally in jsonencode (bug #59122).
Markus Mützel <markus.muetzel@gmx.de>
parents:
28753
diff
changeset
|
427 octave::unwind_protect frame; |
28760
f4ed4be5d809
Use lambda expression instead of file static one-line function in cset b6bed53f059f.
Rik <rik@octave.org>
parents:
28759
diff
changeset
|
428 auto cleanup_ptr = +[] (octave_value_list ws_orig) |
f4ed4be5d809
Use lambda expression instead of file static one-line function in cset b6bed53f059f.
Rik <rik@octave.org>
parents:
28759
diff
changeset
|
429 { set_warning_state (ws_orig); } ; |
f4ed4be5d809
Use lambda expression instead of file static one-line function in cset b6bed53f059f.
Rik <rik@octave.org>
parents:
28759
diff
changeset
|
430 frame.add_fcn (cleanup_ptr, ws); |
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
|
431 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
432 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
|
433 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
434 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
435 error ("jsonencode: unsupported type"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
436 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
437 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
438 #endif |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
439 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
440 DEFUN (jsonencode, args, , |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
441 doc: /* -*- texinfo -*- |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
442 @deftypefn {} {@var{JSON_txt} =} jsonencode (@var{object}) |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
443 @deftypefnx {} {@var{JSON_txt} =} jsonencode (@dots{}, "ConvertInfAndNaN", @var{TF}) |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
444 @deftypefnx {} {@var{JSON_txt} =} jsonencode (@dots{}, "PrettyWriter", @var{TF}) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
445 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
446 Encode Octave data types into JSON text. |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
447 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
448 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
|
449 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
450 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
|
451 @var{object}. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
452 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
453 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
|
454 @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
|
455 @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
|
456 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
|
457 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
458 If the value of the option @qcode{"PrettyWriter"} 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
|
459 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
|
460 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
|
461 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
462 Programming Notes: |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
463 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
464 @itemize @bullet |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
465 @item |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
466 Complex numbers are not supported. |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
467 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
468 @item |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
469 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
|
470 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
471 @item |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
472 To preserve escape characters (e.g., @qcode{"\n"}), use single-quoted strings. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
473 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
474 @item |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
475 Every character after the null character (@qcode{"\0"}) in a double-quoted |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
476 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
|
477 |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
478 @item |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
479 Encoding and decoding an array is not guaranteed to preserve the dimensions |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
480 of the array. For example, if a row vector is encoded and decoded then the |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
481 result will be a column vector. |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
482 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
483 @item |
28753 | 484 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
|
485 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
|
486 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
|
487 @end itemize |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
488 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
489 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
|
490 |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
491 @multitable @columnfractions 0.50 0.50 |
28753 | 492 @headitem Octave data type @tab JSON data type |
493 @item logical scalar @tab Boolean | |
494 @item logical vector @tab Array of Boolean, reshaped to row vector | |
495 @item logical array @tab nested Array of Boolean | |
496 @item numeric scalar @tab Number | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
497 @item numeric vector @tab Array of Number, reshaped to row vector |
28753 | 498 @item numeric array @tab nested Array of Number |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
499 @item @code{NaN}, @code{NA}, @code{Inf}, @code{-Inf}@* |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
500 when @qcode{"ConvertInfAndNaN" = true} @tab @qcode{"null"} |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
501 @item @code{NaN}, @code{NA}, @code{Inf}, @code{-Inf}@* |
28753 | 502 when @qcode{"ConvertInfAndNaN" = false} @tab @qcode{"NaN"}, @qcode{"NaN"}, |
503 @qcode{"Infinity"}, @qcode{"-Infinity"} | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
504 @item empty array @tab @qcode{"[]"} |
28753 | 505 @item character vector @tab String |
506 @item character array @tab Array of String | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
507 @item empty character array @tab @qcode{""} |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
508 @item cell scalar @tab Array |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
509 @item cell vector @tab Array, reshaped to row vector |
28753 | 510 @item cell array @tab Array, flattened to row vector |
511 @item struct scalar @tab Object | |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
512 @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
|
513 @item struct array @tab nested Array of Object |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
514 @item classdef object @tab Object |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
515 @end multitable |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
516 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
517 Examples: |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
518 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
519 @example |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
520 @group |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
521 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
|
522 @result{} [[1,null],[3,4]] |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
523 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
524 |
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], "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
|
527 @result{} [[1,NaN],[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 |
28657
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
531 ## 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
|
532 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
|
533 @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
|
534 @end group |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
535 |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
536 @group |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
537 ## 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
|
538 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
|
539 @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
|
540 @end group |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
541 |
174550af014f
document and test escape characters in jsonencode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28624
diff
changeset
|
542 @group |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
543 jsonencode ([true; false], "PrettyWriter", true) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
544 @result{} ans = [ |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
545 true, |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
546 false |
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
547 ] |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
548 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
549 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
550 @group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
551 jsonencode (['foo', 'bar'; 'foo', 'bar']) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
552 @result{} ["foobar","foobar"] |
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 (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
|
557 @result{} @{"a":null,"b":[],"c":@{@}@} |
28615
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 |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
561 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
|
562 @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
|
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 (@{'foo'; 'bar'; @{'foo'; 'bar'@}@}) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
567 @result{} ["foo","bar",["foo","bar"]] |
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 (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
|
572 @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
|
573 @end group |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
574 @end example |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
575 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
576 @seealso{jsondecode} |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
577 @end deftypefn */) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
578 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
579 #if defined (HAVE_RAPIDJSON) |
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 int nargin = args.length (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
582 // jsonencode has two options 'ConvertInfAndNaN' and 'PrettyWriter' |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
583 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
|
584 print_usage (); |
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 // Initialize options with their default values |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
587 bool ConvertInfAndNaN = true; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
588 bool PrettyWriter = false; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
589 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
590 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
|
591 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
592 if (! args(i).is_string ()) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
593 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
|
594 if (! args(i+1).is_bool_scalar ()) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
595 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
|
596 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
597 std::string option_name = args(i++).string_value (); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
598 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
|
599 ConvertInfAndNaN = args(i).bool_value (); |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
600 else if (octave::string::strcmpi (option_name, "PrettyWriter")) |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
601 PrettyWriter = args(i).bool_value (); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
602 else |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
603 error ("jsonencode: " |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
604 R"(Valid options are "ConvertInfAndNaN" and "PrettyWriter")"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
605 } |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
606 |
28751
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
607 # if ! defined (HAVE_RAPIDJSON_PRETTYWRITER) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
608 if (PrettyWriter) |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
609 { |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
610 warn_disabled_feature ("jsonencode", |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
611 R"(the "PrettyWriter" option of RapidJSON)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
612 PrettyWriter = false; |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
613 } |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
614 # endif |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
615 |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
616 rapidjson::StringBuffer json; |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
617 if (PrettyWriter) |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
618 { |
28751
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
619 # if defined (HAVE_RAPIDJSON_PRETTYWRITER) |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
620 rapidjson::PrettyWriter<rapidjson::StringBuffer, rapidjson::UTF8<>, |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
621 rapidjson::UTF8<>, rapidjson::CrtAllocator, |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
622 rapidjson::kWriteNanAndInfFlag> writer (json); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
623 encode (writer, args(0), ConvertInfAndNaN); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
624 # endif |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
625 } |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
626 else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
627 { |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
628 rapidjson::Writer<rapidjson::StringBuffer, rapidjson::UTF8<>, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
629 rapidjson::UTF8<>, rapidjson::CrtAllocator, |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
630 rapidjson::kWriteNanAndInfFlag> writer (json); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
631 encode (writer, args(0), ConvertInfAndNaN); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
632 } |
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 return octave_value (json.GetString ()); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
635 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
636 #else |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
637 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
638 octave_unused_parameter (args); |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
639 |
28624
aae9d7f098bd
Support for RapidJSON 1.1.0 with jsonencode and jsondecode
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
28615
diff
changeset
|
640 err_disabled_feature ("jsonencode", "JSON encoding through RapidJSON"); |
28615
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
641 |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
642 #endif |
5da49e37a6c9
New functions jsondecode and jsonencode (bug #53100).
Abdallah Elshamy <abdallah.k.elshamy@gmail.com>
parents:
diff
changeset
|
643 } |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
644 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
645 /* |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
646 FIXME: Need BIST tests for encoding each data type |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
647 ##%!testif HAVE_RAPIDJSON |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
648 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
649 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
650 ## Input validation tests |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
651 %!testif HAVE_RAPIDJSON |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
652 %! fail ("jsonencode ()"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
653 %! fail ("jsonencode (1, 2)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
654 %! fail ("jsonencode (1, 2, 3, 4)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
655 %! fail ("jsonencode (1, 2, 3, 4, 5, 6)"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
656 %! fail ("jsonencode (1, 2, true)", "option must be a string"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
657 %! fail ("jsonencode (1, 'string', ones (2,2))", "option value must be a logical scalar"); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
658 %! fail ("jsonencode (1, 'foobar', true)", 'Valid options are "ConvertInfAndNaN"'); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
659 |
28751
699bba597610
Use specific configure test to detect RapidJSON PrettyWriter functionality (bug #59114)
Rik <rik@octave.org>
parents:
28750
diff
changeset
|
660 %!testif HAVE_RAPIDJSON; ! __have_feature__ ("RAPIDJSON_PRETTYWRITER") |
28750
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
661 %! fail ("jsonencode (1, 'PrettyWriter', true)", ... |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
662 %! "warning", 'the "PrettyWriter" option of RapidJSON was unavailable'); |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
663 |
80857685105b
Code review for jsonencode/jsondecode functions.
Rik <rik@octave.org>
parents:
28657
diff
changeset
|
664 */ |