6 #ifndef OPENDDS_DCPS_JSON_VALUE_WRITER_H 7 #define OPENDDS_DCPS_JSON_VALUE_WRITER_H 9 #if defined OPENDDS_RAPIDJSON && !defined OPENDDS_SAFETY_PROFILE 10 # define OPENDDS_HAS_JSON_VALUE_WRITER 1 12 # define OPENDDS_HAS_JSON_VALUE_WRITER 0 15 #if OPENDDS_HAS_JSON_VALUE_WRITER 22 #include <dds/DdsDcpsCoreTypeSupportImpl.h> 23 #include <dds/DdsDcpsTopicC.h> 29 #if !defined (ACE_LACKS_PRAGMA_ONCE) 39 template <
typename Writer>
40 class JsonValueWriter :
public ValueWriter {
42 explicit JsonValueWriter(Writer& writer)
49 void end_struct_member();
53 void begin_discriminator();
54 void end_discriminator();
55 void begin_union_member(
const char*
name);
56 void end_union_member();
60 void begin_sequence();
62 void begin_element(
size_t idx);
67 #if OPENDDS_HAS_EXPLICIT_INTS 80 void write_fixed(
const OpenDDS::FaceTypes::Fixed& value);
91 template <
typename Writer>
92 void JsonValueWriter<Writer>::begin_struct()
94 writer_.StartObject();
97 template <
typename Writer>
98 void JsonValueWriter<Writer>::end_struct()
103 template <
typename Writer>
106 writer_.Key(descriptor.
name());
109 template <
typename Writer>
110 void JsonValueWriter<Writer>::end_struct_member()
113 template <
typename Writer>
114 void JsonValueWriter<Writer>::begin_union()
116 writer_.StartObject();
119 template <
typename Writer>
120 void JsonValueWriter<Writer>::end_union()
125 template <
typename Writer>
126 void JsonValueWriter<Writer>::begin_discriminator()
128 writer_.Key(
"$discriminator");
131 template <
typename Writer>
132 void JsonValueWriter<Writer>::end_discriminator()
135 template <
typename Writer>
136 void JsonValueWriter<Writer>::begin_union_member(
const char*
name)
141 template <
typename Writer>
142 void JsonValueWriter<Writer>::end_union_member()
145 template <
typename Writer>
146 void JsonValueWriter<Writer>::begin_array()
148 writer_.StartArray();
151 template <
typename Writer>
152 void JsonValueWriter<Writer>::end_array()
157 template <
typename Writer>
158 void JsonValueWriter<Writer>::begin_sequence()
160 writer_.StartArray();
163 template <
typename Writer>
164 void JsonValueWriter<Writer>::end_sequence()
169 template <
typename Writer>
170 void JsonValueWriter<Writer>::begin_element(
size_t )
173 template <
typename Writer>
174 void JsonValueWriter<Writer>::end_element()
177 template <
typename Writer>
183 template <
typename Writer>
189 #if OPENDDS_HAS_EXPLICIT_INTS 190 template <
typename Writer>
191 void JsonValueWriter<Writer>::write_int8(
ACE_CDR::Int8 value)
196 template <
typename Writer>
203 template <
typename Writer>
209 template <
typename Writer>
215 template <
typename Writer>
216 void JsonValueWriter<Writer>::write_int32(
ACE_CDR::Long value)
221 template <
typename Writer>
227 template <
typename Writer>
230 writer_.Int64(value);
233 template <
typename Writer>
236 writer_.Uint64(value);
239 template <
typename Writer>
242 writer_.Double(value);
245 template <
typename Writer>
248 writer_.Double(value);
251 template <
typename Writer>
255 writer_.Double(value);
258 template <
typename Writer>
259 void JsonValueWriter<Writer>::write_fixed(
const OpenDDS::FaceTypes::Fixed& )
262 writer_.String(
"fixed");
265 template <
typename Writer>
266 void JsonValueWriter<Writer>::write_char8(
ACE_CDR::Char value)
269 writer_.String(s, 1);
272 template <
typename Writer>
277 rapidjson::GenericStringStream<rapidjson::UTF16<> > source(s);
278 rapidjson::GenericStringBuffer<rapidjson::UTF8<> > target;
280 if (!rapidjson::Transcoder<rapidjson::UTF16<>, rapidjson::UTF8<> >::Transcode(source, target)) {
284 writer_.String(target.GetString(),
static_cast<rapidjson::SizeType
>(target.GetLength()));
287 template <
typename Writer>
288 void JsonValueWriter<Writer>::write_string(
const ACE_CDR::Char* value,
size_t length)
290 writer_.String(value, static_cast<rapidjson::SizeType>(length));
293 template <
typename Writer>
294 void JsonValueWriter<Writer>::write_wstring(
const ACE_CDR::WChar* value,
size_t length)
296 rapidjson::GenericStringStream<rapidjson::UTF16<> > source(value);
297 rapidjson::GenericStringBuffer<rapidjson::UTF8<> > target;
299 while (source.Tell() != length) {
300 if (!rapidjson::Transcoder<rapidjson::UTF16<>, rapidjson::UTF8<> >::Transcode(source, target)) {
305 writer_.String(target.GetString(),
static_cast<rapidjson::SizeType
>(target.GetLength()));
308 template <
typename Writer>
309 void JsonValueWriter<Writer>::write_enum(
const char* name,
312 writer_.String(name);
316 std::string to_json(
const T& sample)
318 rapidjson::StringBuffer buffer;
319 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
320 JsonValueWriter<rapidjson::Writer<rapidjson::StringBuffer> > jvw(writer);
323 return buffer.GetString();
326 template<
typename T,
typename Writer>
327 bool to_json(
const T& sample, Writer& writer)
329 JsonValueWriter<Writer> jvw(writer);
330 return vwrite(jvw, sample);
334 std::string to_json(
const DDS::TopicDescription_ptr topic,
337 rapidjson::StringBuffer buffer;
338 rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
339 JsonValueWriter<rapidjson::Writer<rapidjson::StringBuffer> > jvw(writer);
341 jvw.begin_struct_member(XTypes::MemberDescriptorImpl(
"topic",
false));
343 jvw.begin_struct_member(XTypes::MemberDescriptorImpl(
"name",
false));
345 static_cast<ValueWriter&
>(jvw).write_string(topic_name);
346 jvw.end_struct_member();
347 jvw.begin_struct_member(XTypes::MemberDescriptorImpl(
"type_name",
false));
349 static_cast<ValueWriter&
>(jvw).write_string(type_name);
350 jvw.end_struct_member();
352 jvw.end_struct_member();
353 jvw.begin_struct_member(XTypes::MemberDescriptorImpl(
"sample",
false));
355 jvw.end_struct_member();
356 jvw.begin_struct_member(XTypes::MemberDescriptorImpl(
"sample_info",
false));
358 jvw.end_struct_member();
361 return buffer.GetString();
void vwrite(ValueWriter &vw, const Observer::Sample &sample)
const LogLevel::Value value
#define OPENDDS_END_VERSIONED_NAMESPACE_DECL
The Internal API and Implementation of OpenDDS.