Coverage Report

Created: 2026-06-10 06:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/arduinojson/src/ArduinoJson/Json/JsonSerializer.hpp
Line
Count
Source
1
// ArduinoJson - https://arduinojson.org
2
// Copyright © 2014-2025, Benoit BLANCHON
3
// MIT License
4
5
#pragma once
6
7
#include <ArduinoJson/Json/TextFormatter.hpp>
8
#include <ArduinoJson/Serialization/measure.hpp>
9
#include <ArduinoJson/Serialization/serialize.hpp>
10
#include <ArduinoJson/Variant/VariantDataVisitor.hpp>
11
12
ARDUINOJSON_BEGIN_PRIVATE_NAMESPACE
13
14
template <typename TWriter>
15
class JsonSerializer : public VariantDataVisitor<size_t> {
16
 public:
17
  static const bool producesText = true;
18
19
  JsonSerializer(TWriter writer, ResourceManager* resources)
20
0
      : formatter_(writer), resources_(resources) {}
21
22
0
  size_t visitArray(VariantData* array) {
23
0
    ARDUINOJSON_ASSERT(array != nullptr);
24
0
    ARDUINOJSON_ASSERT(array->isArray());
25
26
0
    write('[');
27
28
0
    auto slotId = array->content.asCollection.head;
29
30
0
    while (slotId != NULL_SLOT) {
31
0
      auto slot = resources_->getVariant(slotId);
32
33
0
      VariantImpl::accept(*this, slot, resources_);
34
35
0
      slotId = slot->next;
36
37
0
      if (slotId != NULL_SLOT)
38
0
        write(',');
39
0
    }
40
41
0
    write(']');
42
0
    return bytesWritten();
43
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visitArray(ArduinoJson::V742HB42::detail::VariantData*)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visitArray(ArduinoJson::V742HB42::detail::VariantData*)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visitArray(ArduinoJson::V742HB42::detail::VariantData*)
44
45
0
  size_t visitObject(VariantData* object) {
46
0
    ARDUINOJSON_ASSERT(object != nullptr);
47
0
    ARDUINOJSON_ASSERT(object->isObject());
48
49
0
    write('{');
50
51
0
    auto slotId = object->content.asCollection.head;
52
53
0
    bool isKey = true;
54
55
0
    while (slotId != NULL_SLOT) {
56
0
      auto slot = resources_->getVariant(slotId);
57
0
      VariantImpl::accept(*this, slot, resources_);
58
59
0
      slotId = slot->next;
60
61
0
      if (slotId != NULL_SLOT)
62
0
        write(isKey ? ':' : ',');
63
64
0
      isKey = !isKey;
65
0
    }
66
67
0
    write('}');
68
0
    return bytesWritten();
69
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visitObject(ArduinoJson::V742HB42::detail::VariantData*)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visitObject(ArduinoJson::V742HB42::detail::VariantData*)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visitObject(ArduinoJson::V742HB42::detail::VariantData*)
70
71
  template <typename T>
72
0
  enable_if_t<is_floating_point<T>::value, size_t> visit(T value) {
73
0
    formatter_.writeFloat(value);
74
0
    return bytesWritten();
75
0
  }
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail14JsonSerializerINS1_6WriterINSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEvEEE5visitIfEENS1_9enable_ifIXsr17is_floating_pointIT_EE5valueEmE4typeESF_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail14JsonSerializerINS1_6WriterINSt3__112basic_stringIcNS4_11char_traitsIcEENS4_9allocatorIcEEEEvEEE5visitIdEENS1_9enable_ifIXsr17is_floating_pointIT_EE5valueEmE4typeESF_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail14JsonSerializerINS1_18StaticStringWriterEE5visitIfEENS1_9enable_ifIXsr17is_floating_pointIT_EE5valueEmE4typeES7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail14JsonSerializerINS1_18StaticStringWriterEE5visitIdEENS1_9enable_ifIXsr17is_floating_pointIT_EE5valueEmE4typeES7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail14JsonSerializerINS1_11DummyWriterEE5visitIfEENS1_9enable_ifIXsr17is_floating_pointIT_EE5valueEmE4typeES7_
Unexecuted instantiation: _ZN11ArduinoJson8V742HB426detail14JsonSerializerINS1_11DummyWriterEE5visitIdEENS1_9enable_ifIXsr17is_floating_pointIT_EE5valueEmE4typeES7_
76
77
  size_t visit(const char* value) {
78
    formatter_.writeString(value);
79
    return bytesWritten();
80
  }
81
82
0
  size_t visit(JsonString value) {
83
0
    formatter_.writeString(value.c_str(), value.size());
84
0
    return bytesWritten();
85
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visit(ArduinoJson::V742HB42::JsonString)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visit(ArduinoJson::V742HB42::JsonString)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visit(ArduinoJson::V742HB42::JsonString)
86
87
0
  size_t visit(RawString value) {
88
0
    formatter_.writeRaw(value.data(), value.size());
89
0
    return bytesWritten();
90
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visit(ArduinoJson::V742HB42::SerializedValue<char const*>)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visit(ArduinoJson::V742HB42::SerializedValue<char const*>)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visit(ArduinoJson::V742HB42::SerializedValue<char const*>)
91
92
0
  size_t visit(JsonInteger value) {
93
0
    formatter_.writeInteger(value);
94
0
    return bytesWritten();
95
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visit(long)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visit(long)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visit(long)
96
97
0
  size_t visit(JsonUInt value) {
98
0
    formatter_.writeInteger(value);
99
0
    return bytesWritten();
100
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visit(unsigned long)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visit(unsigned long)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visit(unsigned long)
101
102
0
  size_t visit(bool value) {
103
0
    formatter_.writeBoolean(value);
104
0
    return bytesWritten();
105
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visit(bool)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visit(bool)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visit(bool)
106
107
0
  size_t visit(nullptr_t) {
108
0
    formatter_.writeRaw("null");
109
0
    return bytesWritten();
110
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::visit(decltype(nullptr))
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::visit(decltype(nullptr))
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::visit(decltype(nullptr))
111
112
 protected:
113
0
  size_t bytesWritten() const {
114
0
    return formatter_.bytesWritten();
115
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::bytesWritten() const
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::bytesWritten() const
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::bytesWritten() const
116
117
0
  void write(char c) {
118
0
    formatter_.writeRaw(c);
119
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::Writer<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, void> >::write(char)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::write(char)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::write(char)
120
121
0
  void write(const char* s) {
122
0
    formatter_.writeRaw(s);
123
0
  }
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::StaticStringWriter>::write(char const*)
Unexecuted instantiation: ArduinoJson::V742HB42::detail::JsonSerializer<ArduinoJson::V742HB42::detail::DummyWriter>::write(char const*)
124
125
 private:
126
  TextFormatter<TWriter> formatter_;
127
128
 protected:
129
  ResourceManager* resources_;
130
};
131
132
ARDUINOJSON_END_PRIVATE_NAMESPACE
133
134
ARDUINOJSON_BEGIN_PUBLIC_NAMESPACE
135
136
// Produces a minified JSON document.
137
// https://arduinojson.org/v7/api/json/serializejson/
138
template <
139
    typename TDestination,
140
    detail::enable_if_t<!detail::is_pointer<TDestination>::value, int> = 0>
141
0
size_t serializeJson(JsonVariantConst source, TDestination& destination) {
142
0
  using namespace detail;
143
0
  return serialize<JsonSerializer>(source, destination);
144
0
}
145
146
// Produces a minified JSON document.
147
// https://arduinojson.org/v7/api/json/serializejson/
148
inline size_t serializeJson(JsonVariantConst source, void* buffer,
149
0
                            size_t bufferSize) {
150
0
  using namespace detail;
151
0
  return serialize<JsonSerializer>(source, buffer, bufferSize);
152
0
}
153
154
// Computes the length of the document that serializeJson() produces.
155
// https://arduinojson.org/v7/api/json/measurejson/
156
0
inline size_t measureJson(JsonVariantConst source) {
157
0
  using namespace detail;
158
0
  return measure<JsonSerializer>(source);
159
0
}
160
161
#if ARDUINOJSON_ENABLE_STD_STREAM
162
template <typename T,
163
          detail::enable_if_t<
164
              detail::is_convertible<T, JsonVariantConst>::value, int> = 0>
165
inline std::ostream& operator<<(std::ostream& os, const T& source) {
166
  serializeJson(source, os);
167
  return os;
168
}
169
#endif
170
171
ARDUINOJSON_END_PUBLIC_NAMESPACE