Zserio C++ runtime library  1.0.0
Built for Zserio 2.13.0
JsonEncoder.cpp
Go to the documentation of this file.
1 #include <iomanip>
2 #include <cmath>
3 #include <array>
4 
5 #include "zserio/JsonEncoder.h"
6 
7 namespace zserio
8 {
9 
10 void JsonEncoder::encodeNull(std::ostream& os)
11 {
12  os << "null";
13 }
14 
15 void JsonEncoder::encodeBool(std::ostream& os, bool value)
16 {
17  os << std::boolalpha << value << std::noboolalpha;
18 }
19 
20 void JsonEncoder::encodeFloatingPoint(std::ostream& os, double value)
21 {
22  if (std::isnan(value))
23  {
24  os << "NaN";
25  }
26  else if (std::isinf(value))
27  {
28  if (value < 0.0)
29  os << "-";
30  os << "Infinity";
31  }
32  else
33  {
34  double intPart = 1e16;
35  const double fractPart = std::modf(value, &intPart);
36  // trying to get closer to behavior of Python
37  if (fractPart == 0.0 && intPart > -1e16 && intPart < 1e16)
38  {
39  os << std::fixed << std::setprecision(1) << value << std::defaultfloat;
40  }
41  else
42  {
43  os << std::setprecision(15) << value << std::defaultfloat;
44  }
45  }
46 }
47 
48 void JsonEncoder::encodeString(std::ostream& os, StringView value)
49 {
50  static const std::array<char, 17> HEX = {"0123456789abcdef"};
51 
52  os.put('"');
53  for (char ch : value)
54  {
55  switch (ch)
56  {
57  case '\\':
58  case '"':
59  os.put('\\');
60  os.put(ch);
61  break;
62  case '\b':
63  os.put('\\');
64  os.put('b');
65  break;
66  case '\f':
67  os.put('\\');
68  os.put('f');
69  break;
70  case '\n':
71  os.put('\\');
72  os.put('n');
73  break;
74  case '\r':
75  os.put('\\');
76  os.put('r');
77  break;
78  case '\t':
79  os.put('\\');
80  os.put('t');
81  break;
82  default:
83  if (static_cast<uint8_t>(ch) <= 0x1F)
84  {
85  os.put('\\');
86  os.put('u');
87  os.put('0');
88  os.put('0');
89  os.put(HEX[static_cast<uint8_t>(static_cast<uint8_t>(ch) >> 4U) & 0xFU]);
90  os.put(HEX[static_cast<uint8_t>(ch) & 0xFU]);
91  }
92  else
93  {
94  os.put(ch);
95  }
96  break;
97  }
98  }
99  os.put('"');
100 }
101 
102 } // namespace zserio
static void encodeString(std::ostream &os, StringView value)
Definition: JsonEncoder.cpp:48
static void encodeBool(std::ostream &os, bool value)
Definition: JsonEncoder.cpp:15
static void encodeFloatingPoint(std::ostream &os, double value)
Definition: JsonEncoder.cpp:20
static void encodeNull(std::ostream &os)
Definition: JsonEncoder.cpp:10