Skip to content

Commit db013c9

Browse files
authored
Merge pull request #2071 from nlohmann/issue2067
Properly pass serialize_binary to dump function
2 parents b1fe6ee + 2e5727d commit db013c9

4 files changed

Lines changed: 34 additions & 20 deletions

File tree

include/nlohmann/detail/output/serializer.hpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class serializer
127127
o->write_character('\"');
128128
dump_escaped(i->first, ensure_ascii);
129129
o->write_characters("\": ", 3);
130-
dump(i->second, true, ensure_ascii, indent_step, new_indent);
130+
dump(i->second, true, ensure_ascii, indent_step, new_indent, serialize_binary);
131131
o->write_characters(",\n", 2);
132132
}
133133

@@ -138,7 +138,7 @@ class serializer
138138
o->write_character('\"');
139139
dump_escaped(i->first, ensure_ascii);
140140
o->write_characters("\": ", 3);
141-
dump(i->second, true, ensure_ascii, indent_step, new_indent);
141+
dump(i->second, true, ensure_ascii, indent_step, new_indent, serialize_binary);
142142

143143
o->write_character('\n');
144144
o->write_characters(indent_string.c_str(), current_indent);
@@ -155,7 +155,7 @@ class serializer
155155
o->write_character('\"');
156156
dump_escaped(i->first, ensure_ascii);
157157
o->write_characters("\":", 2);
158-
dump(i->second, false, ensure_ascii, indent_step, current_indent);
158+
dump(i->second, false, ensure_ascii, indent_step, current_indent, serialize_binary);
159159
o->write_character(',');
160160
}
161161

@@ -165,7 +165,7 @@ class serializer
165165
o->write_character('\"');
166166
dump_escaped(i->first, ensure_ascii);
167167
o->write_characters("\":", 2);
168-
dump(i->second, false, ensure_ascii, indent_step, current_indent);
168+
dump(i->second, false, ensure_ascii, indent_step, current_indent, serialize_binary);
169169

170170
o->write_character('}');
171171
}
@@ -197,14 +197,14 @@ class serializer
197197
i != val.m_value.array->cend() - 1; ++i)
198198
{
199199
o->write_characters(indent_string.c_str(), new_indent);
200-
dump(*i, true, ensure_ascii, indent_step, new_indent);
200+
dump(*i, true, ensure_ascii, indent_step, new_indent, serialize_binary);
201201
o->write_characters(",\n", 2);
202202
}
203203

204204
// last element
205205
assert(not val.m_value.array->empty());
206206
o->write_characters(indent_string.c_str(), new_indent);
207-
dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);
207+
dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent, serialize_binary);
208208

209209
o->write_character('\n');
210210
o->write_characters(indent_string.c_str(), current_indent);
@@ -218,13 +218,13 @@ class serializer
218218
for (auto i = val.m_value.array->cbegin();
219219
i != val.m_value.array->cend() - 1; ++i)
220220
{
221-
dump(*i, false, ensure_ascii, indent_step, current_indent);
221+
dump(*i, false, ensure_ascii, indent_step, current_indent, serialize_binary);
222222
o->write_character(',');
223223
}
224224

225225
// last element
226226
assert(not val.m_value.array->empty());
227-
dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);
227+
dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent, serialize_binary);
228228

229229
o->write_character(']');
230230
}

include/nlohmann/json.hpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2237,11 +2237,11 @@ class basic_json
22372237

22382238
if (indent >= 0)
22392239
{
2240-
s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent), serialize_binary);
2240+
s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent), 0, serialize_binary);
22412241
}
22422242
else
22432243
{
2244-
s.dump(*this, false, ensure_ascii, 0, serialize_binary);
2244+
s.dump(*this, false, ensure_ascii, 0, 0, serialize_binary);
22452245
}
22462246

22472247
return result;

single_include/nlohmann/json.hpp

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -14760,7 +14760,7 @@ class serializer
1476014760
o->write_character('\"');
1476114761
dump_escaped(i->first, ensure_ascii);
1476214762
o->write_characters("\": ", 3);
14763-
dump(i->second, true, ensure_ascii, indent_step, new_indent);
14763+
dump(i->second, true, ensure_ascii, indent_step, new_indent, serialize_binary);
1476414764
o->write_characters(",\n", 2);
1476514765
}
1476614766

@@ -14771,7 +14771,7 @@ class serializer
1477114771
o->write_character('\"');
1477214772
dump_escaped(i->first, ensure_ascii);
1477314773
o->write_characters("\": ", 3);
14774-
dump(i->second, true, ensure_ascii, indent_step, new_indent);
14774+
dump(i->second, true, ensure_ascii, indent_step, new_indent, serialize_binary);
1477514775

1477614776
o->write_character('\n');
1477714777
o->write_characters(indent_string.c_str(), current_indent);
@@ -14788,7 +14788,7 @@ class serializer
1478814788
o->write_character('\"');
1478914789
dump_escaped(i->first, ensure_ascii);
1479014790
o->write_characters("\":", 2);
14791-
dump(i->second, false, ensure_ascii, indent_step, current_indent);
14791+
dump(i->second, false, ensure_ascii, indent_step, current_indent, serialize_binary);
1479214792
o->write_character(',');
1479314793
}
1479414794

@@ -14798,7 +14798,7 @@ class serializer
1479814798
o->write_character('\"');
1479914799
dump_escaped(i->first, ensure_ascii);
1480014800
o->write_characters("\":", 2);
14801-
dump(i->second, false, ensure_ascii, indent_step, current_indent);
14801+
dump(i->second, false, ensure_ascii, indent_step, current_indent, serialize_binary);
1480214802

1480314803
o->write_character('}');
1480414804
}
@@ -14830,14 +14830,14 @@ class serializer
1483014830
i != val.m_value.array->cend() - 1; ++i)
1483114831
{
1483214832
o->write_characters(indent_string.c_str(), new_indent);
14833-
dump(*i, true, ensure_ascii, indent_step, new_indent);
14833+
dump(*i, true, ensure_ascii, indent_step, new_indent, serialize_binary);
1483414834
o->write_characters(",\n", 2);
1483514835
}
1483614836

1483714837
// last element
1483814838
assert(not val.m_value.array->empty());
1483914839
o->write_characters(indent_string.c_str(), new_indent);
14840-
dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent);
14840+
dump(val.m_value.array->back(), true, ensure_ascii, indent_step, new_indent, serialize_binary);
1484114841

1484214842
o->write_character('\n');
1484314843
o->write_characters(indent_string.c_str(), current_indent);
@@ -14851,13 +14851,13 @@ class serializer
1485114851
for (auto i = val.m_value.array->cbegin();
1485214852
i != val.m_value.array->cend() - 1; ++i)
1485314853
{
14854-
dump(*i, false, ensure_ascii, indent_step, current_indent);
14854+
dump(*i, false, ensure_ascii, indent_step, current_indent, serialize_binary);
1485514855
o->write_character(',');
1485614856
}
1485714857

1485814858
// last element
1485914859
assert(not val.m_value.array->empty());
14860-
dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent);
14860+
dump(val.m_value.array->back(), false, ensure_ascii, indent_step, current_indent, serialize_binary);
1486114861

1486214862
o->write_character(']');
1486314863
}
@@ -17723,11 +17723,11 @@ class basic_json
1772317723

1772417724
if (indent >= 0)
1772517725
{
17726-
s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent), serialize_binary);
17726+
s.dump(*this, true, ensure_ascii, static_cast<unsigned int>(indent), 0, serialize_binary);
1772717727
}
1772817728
else
1772917729
{
17730-
s.dump(*this, false, ensure_ascii, 0, serialize_binary);
17730+
s.dump(*this, false, ensure_ascii, 0, 0, serialize_binary);
1773117731
}
1773217732

1773317733
return result;

test/src/unit-regression.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1904,6 +1904,20 @@ TEST_CASE("regression tests")
19041904
const auto result = json::diff(source, target);
19051905
CHECK(result.dump() == R"([{"op":"add","path":"/foo/-","value":"3"}])");
19061906
}
1907+
1908+
SECTION("issue #2067 - cannot serialize binary data to text JSON")
1909+
{
1910+
const unsigned char data[] = {0x81, 0xA4, 0x64, 0x61, 0x74, 0x61, 0xC4, 0x0F, 0x33, 0x30, 0x30, 0x32, 0x33, 0x34, 0x30, 0x31, 0x30, 0x37, 0x30, 0x35, 0x30, 0x31, 0x30};
1911+
json j = json::from_msgpack(data, sizeof(data) / sizeof(data[0]));
1912+
CHECK_NOTHROW(
1913+
j.dump(4, // Indent
1914+
' ', // Indent char
1915+
false, // Ensure ascii
1916+
json::error_handler_t::strict, // Error
1917+
true // Allow binary data
1918+
)
1919+
);
1920+
}
19071921
}
19081922

19091923
#if not defined(JSON_NOEXCEPTION)

0 commit comments

Comments
 (0)