Added ability to switch to unix/windows end-of-line format for dump.
This commit is contained in:
parent
67b9f1936d
commit
32ade498f9
28
src/json.hpp
28
src/json.hpp
@ -2186,6 +2186,9 @@ class basic_json
|
|||||||
`0` will only insert newlines. `-1` (the default) selects the most compact
|
`0` will only insert newlines. `-1` (the default) selects the most compact
|
||||||
representation.
|
representation.
|
||||||
|
|
||||||
|
@param[in] unix_eol If set to true, it will use unix end of line "\n"
|
||||||
|
or if set to false, it will use windows end of line "\r\n".
|
||||||
|
|
||||||
@return string containing the serialization of the JSON value
|
@return string containing the serialization of the JSON value
|
||||||
|
|
||||||
@complexity Linear.
|
@complexity Linear.
|
||||||
@ -2197,7 +2200,7 @@ class basic_json
|
|||||||
|
|
||||||
@since version 1.0.0
|
@since version 1.0.0
|
||||||
*/
|
*/
|
||||||
string_t dump(const int indent = -1) const
|
string_t dump(const int indent = -1, const bool unix_eol = true) const
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
// fix locale problems
|
// fix locale problems
|
||||||
@ -2212,11 +2215,11 @@ class basic_json
|
|||||||
|
|
||||||
if (indent >= 0)
|
if (indent >= 0)
|
||||||
{
|
{
|
||||||
dump(ss, true, static_cast<unsigned int>(indent));
|
dump(ss, true, static_cast<unsigned int>(indent), unix_eol);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dump(ss, false, 0);
|
dump(ss, false, 0, unix_eol);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ss.str();
|
return ss.str();
|
||||||
@ -6359,15 +6362,18 @@ class basic_json
|
|||||||
@param[out] o stream to write to
|
@param[out] o stream to write to
|
||||||
@param[in] pretty_print whether the output shall be pretty-printed
|
@param[in] pretty_print whether the output shall be pretty-printed
|
||||||
@param[in] indent_step the indent level
|
@param[in] indent_step the indent level
|
||||||
|
@param[in] unix_eol whether to use unix end of line or windows end of line
|
||||||
@param[in] current_indent the current indent level (only used internally)
|
@param[in] current_indent the current indent level (only used internally)
|
||||||
*/
|
*/
|
||||||
void dump(std::ostream& o,
|
void dump(std::ostream& o,
|
||||||
const bool pretty_print,
|
const bool pretty_print,
|
||||||
const unsigned int indent_step,
|
const unsigned int indent_step,
|
||||||
|
const bool unix_eol = true,
|
||||||
const unsigned int current_indent = 0) const
|
const unsigned int current_indent = 0) const
|
||||||
{
|
{
|
||||||
// variable to hold indentation for recursive calls
|
// variable to hold indentation for recursive calls
|
||||||
unsigned int new_indent = current_indent;
|
unsigned int new_indent = current_indent;
|
||||||
|
const char* eol = (unix_eol ? "\n" : "\r\n");
|
||||||
|
|
||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
@ -6385,26 +6391,26 @@ class basic_json
|
|||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent += indent_step;
|
new_indent += indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i)
|
for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i)
|
||||||
{
|
{
|
||||||
if (i != m_value.object->cbegin())
|
if (i != m_value.object->cbegin())
|
||||||
{
|
{
|
||||||
o << (pretty_print ? ",\n" : ",");
|
o << "," << (pretty_print ? eol : "");
|
||||||
}
|
}
|
||||||
o << string_t(new_indent, ' ') << "\""
|
o << string_t(new_indent, ' ') << "\""
|
||||||
<< escape_string(i->first) << "\":"
|
<< escape_string(i->first) << "\":"
|
||||||
<< (pretty_print ? " " : "");
|
<< (pretty_print ? " " : "");
|
||||||
i->second.dump(o, pretty_print, indent_step, new_indent);
|
i->second.dump(o, pretty_print, indent_step, unix_eol, new_indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrease indentation
|
// decrease indentation
|
||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent -= indent_step;
|
new_indent -= indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
o << string_t(new_indent, ' ') + "}";
|
o << string_t(new_indent, ' ') + "}";
|
||||||
@ -6425,24 +6431,24 @@ class basic_json
|
|||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent += indent_step;
|
new_indent += indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i)
|
for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i)
|
||||||
{
|
{
|
||||||
if (i != m_value.array->cbegin())
|
if (i != m_value.array->cbegin())
|
||||||
{
|
{
|
||||||
o << (pretty_print ? ",\n" : ",");
|
o << "," << (pretty_print ? eol : "");
|
||||||
}
|
}
|
||||||
o << string_t(new_indent, ' ');
|
o << string_t(new_indent, ' ');
|
||||||
i->dump(o, pretty_print, indent_step, new_indent);
|
i->dump(o, pretty_print, indent_step, unix_eol, new_indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrease indentation
|
// decrease indentation
|
||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent -= indent_step;
|
new_indent -= indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
o << string_t(new_indent, ' ') << "]";
|
o << string_t(new_indent, ' ') << "]";
|
||||||
|
|||||||
@ -2186,6 +2186,9 @@ class basic_json
|
|||||||
`0` will only insert newlines. `-1` (the default) selects the most compact
|
`0` will only insert newlines. `-1` (the default) selects the most compact
|
||||||
representation.
|
representation.
|
||||||
|
|
||||||
|
@param[in] unix_eol If set to true, it will use unix end of line "\n"
|
||||||
|
or if set to false, it will use windows end of line "\r\n".
|
||||||
|
|
||||||
@return string containing the serialization of the JSON value
|
@return string containing the serialization of the JSON value
|
||||||
|
|
||||||
@complexity Linear.
|
@complexity Linear.
|
||||||
@ -2197,7 +2200,7 @@ class basic_json
|
|||||||
|
|
||||||
@since version 1.0.0
|
@since version 1.0.0
|
||||||
*/
|
*/
|
||||||
string_t dump(const int indent = -1) const
|
string_t dump(const int indent = -1, const bool unix_eol = true) const
|
||||||
{
|
{
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
// fix locale problems
|
// fix locale problems
|
||||||
@ -2212,11 +2215,11 @@ class basic_json
|
|||||||
|
|
||||||
if (indent >= 0)
|
if (indent >= 0)
|
||||||
{
|
{
|
||||||
dump(ss, true, static_cast<unsigned int>(indent));
|
dump(ss, true, static_cast<unsigned int>(indent), unix_eol);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
dump(ss, false, 0);
|
dump(ss, false, 0, unix_eol);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ss.str();
|
return ss.str();
|
||||||
@ -6359,15 +6362,18 @@ class basic_json
|
|||||||
@param[out] o stream to write to
|
@param[out] o stream to write to
|
||||||
@param[in] pretty_print whether the output shall be pretty-printed
|
@param[in] pretty_print whether the output shall be pretty-printed
|
||||||
@param[in] indent_step the indent level
|
@param[in] indent_step the indent level
|
||||||
|
@param[in] unix_eol whether to use unix end of line or windows end of line
|
||||||
@param[in] current_indent the current indent level (only used internally)
|
@param[in] current_indent the current indent level (only used internally)
|
||||||
*/
|
*/
|
||||||
void dump(std::ostream& o,
|
void dump(std::ostream& o,
|
||||||
const bool pretty_print,
|
const bool pretty_print,
|
||||||
const unsigned int indent_step,
|
const unsigned int indent_step,
|
||||||
|
const bool unix_eol,
|
||||||
const unsigned int current_indent = 0) const
|
const unsigned int current_indent = 0) const
|
||||||
{
|
{
|
||||||
// variable to hold indentation for recursive calls
|
// variable to hold indentation for recursive calls
|
||||||
unsigned int new_indent = current_indent;
|
unsigned int new_indent = current_indent;
|
||||||
|
const char* eol = (unix_eol ? "\n" : "\r\n");
|
||||||
|
|
||||||
switch (m_type)
|
switch (m_type)
|
||||||
{
|
{
|
||||||
@ -6385,26 +6391,26 @@ class basic_json
|
|||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent += indent_step;
|
new_indent += indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i)
|
for (auto i = m_value.object->cbegin(); i != m_value.object->cend(); ++i)
|
||||||
{
|
{
|
||||||
if (i != m_value.object->cbegin())
|
if (i != m_value.object->cbegin())
|
||||||
{
|
{
|
||||||
o << (pretty_print ? ",\n" : ",");
|
o << "," << (pretty_print ? eol : "");
|
||||||
}
|
}
|
||||||
o << string_t(new_indent, ' ') << "\""
|
o << string_t(new_indent, ' ') << "\""
|
||||||
<< escape_string(i->first) << "\":"
|
<< escape_string(i->first) << "\":"
|
||||||
<< (pretty_print ? " " : "");
|
<< (pretty_print ? " " : "");
|
||||||
i->second.dump(o, pretty_print, indent_step, new_indent);
|
i->second.dump(o, pretty_print, indent_step, unix_eol, new_indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrease indentation
|
// decrease indentation
|
||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent -= indent_step;
|
new_indent -= indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
o << string_t(new_indent, ' ') + "}";
|
o << string_t(new_indent, ' ') + "}";
|
||||||
@ -6425,24 +6431,24 @@ class basic_json
|
|||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent += indent_step;
|
new_indent += indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i)
|
for (auto i = m_value.array->cbegin(); i != m_value.array->cend(); ++i)
|
||||||
{
|
{
|
||||||
if (i != m_value.array->cbegin())
|
if (i != m_value.array->cbegin())
|
||||||
{
|
{
|
||||||
o << (pretty_print ? ",\n" : ",");
|
o << "," << (pretty_print ? eol : "");
|
||||||
}
|
}
|
||||||
o << string_t(new_indent, ' ');
|
o << string_t(new_indent, ' ');
|
||||||
i->dump(o, pretty_print, indent_step, new_indent);
|
i->dump(o, pretty_print, indent_step, unix_eol, new_indent);
|
||||||
}
|
}
|
||||||
|
|
||||||
// decrease indentation
|
// decrease indentation
|
||||||
if (pretty_print)
|
if (pretty_print)
|
||||||
{
|
{
|
||||||
new_indent -= indent_step;
|
new_indent -= indent_step;
|
||||||
o << "\n";
|
o << eol;
|
||||||
}
|
}
|
||||||
|
|
||||||
o << string_t(new_indent, ' ') << "]";
|
o << string_t(new_indent, ' ') << "]";
|
||||||
|
|||||||
@ -213,6 +213,12 @@ TEST_CASE("object inspection")
|
|||||||
"{\n \"array\": [\n 1,\n 2,\n 3,\n 4\n ],\n \"boolean\": false,\n \"null\": null,\n \"number\": 42,\n \"object\": {},\n \"string\": \"Hello world\"\n}");
|
"{\n \"array\": [\n 1,\n 2,\n 3,\n 4\n ],\n \"boolean\": false,\n \"null\": null,\n \"number\": 42,\n \"object\": {},\n \"string\": \"Hello world\"\n}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SECTION("indent=0, windows EOL")
|
||||||
|
{
|
||||||
|
CHECK(j.dump(0, false) ==
|
||||||
|
"{\r\n\"array\": [\r\n1,\r\n2,\r\n3,\r\n4\r\n],\r\n\"boolean\": false,\r\n\"null\": null,\r\n\"number\": 42,\r\n\"object\": {},\r\n\"string\": \"Hello world\"\r\n}");
|
||||||
|
}
|
||||||
|
|
||||||
SECTION("dump and floating-point numbers")
|
SECTION("dump and floating-point numbers")
|
||||||
{
|
{
|
||||||
auto s = json(42.23).dump();
|
auto s = json(42.23).dump();
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user