121 explicit JsonConverter(
const std::vector<std::string>& column_names)
122 : column_names_(column_names) {
123 escaped_object_keys_.reserve(column_names_.size());
124 column_positions_.reserve(column_names_.size());
126 for (
size_t i = 0; i < column_names_.size(); ++i) {
127 escaped_object_keys_.push_back(
'"' + json_escape_string(column_names_[i]) +
"\":");
128 column_positions_[column_names_[i]] = i;
132 template<
typename FieldAt>
133 std::string row_to_json(
size_t field_count, FieldAt field_at,
const std::vector<std::string>& subset = {})
const {
134 return subset.empty()
135 ? this->row_to_json_all(field_count, field_at)
136 : this->row_to_json_subset(field_count, field_at, subset);
139 template<
typename FieldAt>
140 std::string row_to_json_array(
size_t field_count, FieldAt field_at,
const std::vector<std::string>& subset = {})
const {
141 return subset.empty()
142 ? this->row_to_json_array_all(field_count, field_at)
143 : this->row_to_json_array_subset(field_count, field_at, subset);
147 template<
typename FieldAt>
148 std::string row_to_json_all(
size_t field_count, FieldAt field_at)
const {
149 const size_t count = (field_count < escaped_object_keys_.size()) ? field_count : escaped_object_keys_.size();
150 std::string out =
"{";
152 for (
size_t i = 0; i < count; ++i) {
153 out += escaped_object_keys_[i];
154 this->append_json_value(out, field_at(i));
164 template<
typename FieldAt>
165 std::string row_to_json_subset(
168 const std::vector<std::string>& subset
170 std::string out =
"{";
173 for (
const auto& column : subset) {
174 const size_t index = this->index_of(column);
175 if (index >= field_count) {
183 out += escaped_object_keys_[index];
184 this->append_json_value(out, field_at(index));
192 template<
typename FieldAt>
193 std::string row_to_json_array_all(
size_t field_count, FieldAt field_at)
const {
194 const size_t count = (field_count < column_names_.size()) ? field_count : column_names_.size();
195 std::string out =
"[";
197 for (
size_t i = 0; i < count; ++i) {
198 this->append_json_value(out, field_at(i));
208 template<
typename FieldAt>
209 std::string row_to_json_array_subset(
212 const std::vector<std::string>& subset
214 std::string out =
"[";
217 for (
const auto& column : subset) {
218 const size_t index = this->index_of(column);
219 if (index >= field_count) {
227 this->append_json_value(out, field_at(index));
236 const DataType type = internals::data_type(value);
238 append_json_number_without_leading_zeros(out, value);
243 append_json_escaped(out, value);
248 size_t index_of(
const std::string& column)
const {
249 const auto it = column_positions_.find(column);
250 if (it == column_positions_.end()) {
251 throw_column_not_found(column);
257 std::vector<std::string> column_names_;
258 std::vector<std::string> escaped_object_keys_;
259 std::unordered_map<std::string, size_t> column_positions_;