]>
git.proxmox.com Git - ceph.git/blob - ceph/src/rapidjson/example/jsonx/jsonx.cpp
1 // JSON to JSONx conversion exmaple, using SAX API.
2 // JSONx is an IBM standard format to represent JSON as XML.
3 // https://www-01.ibm.com/support/knowledgecenter/SS9H2Y_7.1.0/com.ibm.dp.doc/json_jsonx.html
4 // This example parses JSON text from stdin with validation,
5 // and convert to JSONx format to stdout.
6 // Need compile with -D__STDC_FORMAT_MACROS for defining PRId64 and PRIu64 macros.
8 #include "rapidjson/reader.h"
9 #include "rapidjson/stringbuffer.h"
10 #include "rapidjson/filereadstream.h"
11 #include "rapidjson/filewritestream.h"
12 #include "rapidjson/error/en.h"
15 using namespace rapidjson
;
17 // For simplicity, this example only read/write in UTF-8 encoding
18 template <typename OutputStream
>
21 JsonxWriter(OutputStream
& os
) : os_(os
), name_(), level_(0), hasName_(false) {
25 return WriteStartElement("null", true);
30 WriteStartElement("boolean") &&
31 WriteString(b
? "true" : "false") &&
32 WriteEndElement("boolean");
37 return WriteNumberElement(buffer
, sprintf(buffer
, "%d", i
));
40 bool Uint(unsigned i
) {
42 return WriteNumberElement(buffer
, sprintf(buffer
, "%u", i
));
45 bool Int64(int64_t i
) {
47 return WriteNumberElement(buffer
, sprintf(buffer
, "%" PRId64
, i
));
50 bool Uint64(uint64_t i
) {
52 return WriteNumberElement(buffer
, sprintf(buffer
, "%" PRIu64
, i
));
55 bool Double(double d
) {
57 return WriteNumberElement(buffer
, sprintf(buffer
, "%.17g", d
));
60 bool RawNumber(const char* str
, SizeType length
, bool) {
62 WriteStartElement("number") &&
63 WriteEscapedText(str
, length
) &&
64 WriteEndElement("number");
67 bool String(const char* str
, SizeType length
, bool) {
69 WriteStartElement("string") &&
70 WriteEscapedText(str
, length
) &&
71 WriteEndElement("string");
75 return WriteStartElement("object");
78 bool Key(const char* str
, SizeType length
, bool) {
79 // backup key to name_
81 for (SizeType i
= 0; i
< length
; i
++)
87 bool EndObject(SizeType
) {
88 return WriteEndElement("object");
92 return WriteStartElement("array");
95 bool EndArray(SizeType
) {
96 return WriteEndElement("array");
100 bool WriteString(const char* s
) {
106 bool WriteEscapedAttributeValue(const char* s
, size_t length
) {
107 for (size_t i
= 0; i
< length
; i
++) {
109 case '&': WriteString("&"); break;
110 case '<': WriteString("<"); break;
111 case '"': WriteString("""); break;
112 default: os_
.Put(s
[i
]); break;
118 bool WriteEscapedText(const char* s
, size_t length
) {
119 for (size_t i
= 0; i
< length
; i
++) {
121 case '&': WriteString("&"); break;
122 case '<': WriteString("<"); break;
123 default: os_
.Put(s
[i
]); break;
129 bool WriteStartElement(const char* type
, bool emptyElement
= false) {
131 if (!WriteString("<?xml version=\"1.0\" encoding=\"UTF-8\"?>"))
134 if (!WriteString("<json:") || !WriteString(type
))
137 // For root element, need to add declarations
140 " xsi:schemaLocation=\"http://www.datapower.com/schemas/json jsonx.xsd\""
141 " xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
142 " xmlns:json=\"http://www.ibm.com/xmlns/prod/2009/jsonx\""))
148 if (!WriteString(" name=\"") ||
149 !WriteEscapedAttributeValue(name_
.GetString(), name_
.GetSize()) ||
155 return WriteString("/>");
158 return WriteString(">");
162 bool WriteEndElement(const char* type
) {
163 if (!WriteString("</json:") ||
164 !WriteString(type
) ||
168 // For the last end tag, flush the output stream.
175 bool WriteNumberElement(const char* buffer
, int length
) {
176 if (!WriteStartElement("number"))
178 for (int j
= 0; j
< length
; j
++)
180 return WriteEndElement("number");
189 int main(int, char*[]) {
190 // Prepare JSON reader and input stream.
192 char readBuffer
[65536];
193 FileReadStream
is(stdin
, readBuffer
, sizeof(readBuffer
));
195 // Prepare JSON writer and output stream.
196 char writeBuffer
[65536];
197 FileWriteStream
os(stdout
, writeBuffer
, sizeof(writeBuffer
));
198 JsonxWriter
<FileWriteStream
> writer(os
);
200 // JSON reader parse from the input stream and let writer generate the output.
201 if (!reader
.Parse(is
, writer
)) {
202 fprintf(stderr
, "\nError(%u): %s\n", static_cast<unsigned>(reader
.GetErrorOffset()), GetParseError_En(reader
.GetParseErrorCode()));