| // JSON pretty formatting example | |
| // This example can handle UTF-8/UTF-16LE/UTF-16BE/UTF-32LE/UTF-32BE. | |
| // The input firstly convert to UTF8, and then write to the original encoding with pretty formatting. | |
| #include "rapidjson/reader.h" | |
| #include "rapidjson/prettywriter.h" | |
| #include "rapidjson/filereadstream.h" | |
| #include "rapidjson/filewritestream.h" | |
| #include "rapidjson/encodedstream.h" // NEW | |
| #include "rapidjson/error/en.h" | |
| #ifdef _WIN32 | |
| #include <fcntl.h> | |
| #include <io.h> | |
| #endif | |
| using namespace rapidjson; | |
| int main(int, char*[]) { | |
| #ifdef _WIN32 | |
| // Prevent Windows converting between CR+LF and LF | |
| _setmode(_fileno(stdin), _O_BINARY); // NEW | |
| _setmode(_fileno(stdout), _O_BINARY); // NEW | |
| #endif | |
| // Prepare reader and input stream. | |
| //Reader reader; | |
| GenericReader<AutoUTF<unsigned>, UTF8<> > reader; // CHANGED | |
| char readBuffer[65536]; | |
| FileReadStream is(stdin, readBuffer, sizeof(readBuffer)); | |
| AutoUTFInputStream<unsigned, FileReadStream> eis(is); // NEW | |
| // Prepare writer and output stream. | |
| char writeBuffer[65536]; | |
| FileWriteStream os(stdout, writeBuffer, sizeof(writeBuffer)); | |
| #if 1 | |
| // Use the same Encoding of the input. Also use BOM according to input. | |
| typedef AutoUTFOutputStream<unsigned, FileWriteStream> OutputStream; // NEW | |
| OutputStream eos(os, eis.GetType(), eis.HasBOM()); // NEW | |
| PrettyWriter<OutputStream, UTF8<>, AutoUTF<unsigned> > writer(eos); // CHANGED | |
| #else | |
| // You may also use static bound encoding type, such as output to UTF-16LE with BOM | |
| typedef EncodedOutputStream<UTF16LE<>,FileWriteStream> OutputStream; // NEW | |
| OutputStream eos(os, true); // NEW | |
| PrettyWriter<OutputStream, UTF8<>, UTF16LE<> > writer(eos); // CHANGED | |
| #endif | |
| // JSON reader parse from the input stream and let writer generate the output. | |
| //if (!reader.Parse<kParseValidateEncodingFlag>(is, writer)) { | |
| if (!reader.Parse<kParseValidateEncodingFlag>(eis, writer)) { // CHANGED | |
| fprintf(stderr, "\nError(%u): %s\n", static_cast<unsigned>(reader.GetErrorOffset()), GetParseError_En(reader.GetParseErrorCode())); | |
| return 1; | |
| } | |
| return 0; | |
| } |