99 explicit JsonConverter(
const std::vector<std::string>& column_names)
100 : column_names_(column_names) {
101 escaped_object_keys_.reserve(column_names_.size());
102 column_positions_.reserve(column_names_.size());
104 for (
size_t i = 0; i < column_names_.size(); ++i) {
105 escaped_object_keys_.push_back(
'"' + json_escape_string(column_names_[i]) +
"\":");
106 column_positions_[column_names_[i]] = i;
110 template<
typename FieldAt>
111 std::string row_to_json(
size_t field_count, FieldAt field_at,
const std::vector<std::string>& subset = {})
const {
112 return subset.empty()
113 ? this->row_to_json_all(field_count, field_at)
114 : this->row_to_json_subset(field_count, field_at, subset);
117 template<
typename FieldAt>
118 std::string row_to_json_array(
size_t field_count, FieldAt field_at,
const std::vector<std::string>& subset = {})
const {
119 return subset.empty()
120 ? this->row_to_json_array_all(field_count, field_at)
121 : this->row_to_json_array_subset(field_count, field_at, subset);
125 template<
typename FieldAt>
126 std::string row_to_json_all(
size_t field_count, FieldAt field_at)
const {
127 const size_t count = (field_count < escaped_object_keys_.size()) ? field_count : escaped_object_keys_.size();
128 std::string out =
"{";
130 for (
size_t i = 0; i < count; ++i) {
131 out += escaped_object_keys_[i];
132 this->append_json_value(out, field_at(i));
142 template<
typename FieldAt>
143 std::string row_to_json_subset(
146 const std::vector<std::string>& subset
148 std::string out =
"{";
151 for (
const auto& column : subset) {
152 const size_t index = this->index_of(column);
153 if (index >= field_count) {
161 out += escaped_object_keys_[index];
162 this->append_json_value(out, field_at(index));
170 template<
typename FieldAt>
171 std::string row_to_json_array_all(
size_t field_count, FieldAt field_at)
const {
172 const size_t count = (field_count < column_names_.size()) ? field_count : column_names_.size();
173 std::string out =
"[";
175 for (
size_t i = 0; i < count; ++i) {
176 this->append_json_value(out, field_at(i));
186 template<
typename FieldAt>
187 std::string row_to_json_array_subset(
190 const std::vector<std::string>& subset
192 std::string out =
"[";
195 for (
const auto& column : subset) {
196 const size_t index = this->index_of(column);
197 if (index >= field_count) {
205 this->append_json_value(out, field_at(index));
214 const DataType type = internals::data_type(value);
216 out.append(value.data(), value.size());
219 append_json_escaped(out, value);
224 size_t index_of(
const std::string& column)
const {
225 const auto it = column_positions_.find(column);
226 if (it == column_positions_.end()) {
227 throw_column_not_found(column);
233 std::vector<std::string> column_names_;
234 std::vector<std::string> escaped_object_keys_;
235 std::unordered_map<std::string, size_t> column_positions_;