160 explicit JsonConverter(
const std::vector<std::string>& column_names)
161 : column_names_(column_names) {
162 escaped_object_keys_.reserve(column_names_.size());
163 column_positions_.reserve(column_names_.size());
165 for (
size_t i = 0; i < column_names_.size(); ++i) {
166 escaped_object_keys_.push_back(
'"' + json_escape_string(column_names_[i]) +
"\":");
167 column_positions_[column_names_[i]] = i;
171 template<
typename FieldAt>
172 std::string row_to_json(
size_t field_count, FieldAt field_at)
const {
173 return row_to_json_all(field_count, field_at);
176 template<
typename FieldAt>
177 std::string row_to_json_array(
size_t field_count, FieldAt field_at)
const {
178 return row_to_json_array_all(field_count, field_at);
181 template<
typename FieldAt>
182 std::string try_row_to_json(
size_t field_count, FieldAt field_at,
183 const std::vector<std::string>& subset,
CSVError& error)
const {
185 return subset.empty() ? row_to_json_all(field_count, field_at)
186 : row_to_json_subset(field_count, field_at, subset, error);
189 template<
typename FieldAt>
190 std::string try_row_to_json_array(
size_t field_count, FieldAt field_at,
191 const std::vector<std::string>& subset,
CSVError& error)
const {
193 return subset.empty() ? row_to_json_array_all(field_count, field_at)
194 : row_to_json_array_subset(field_count, field_at, subset, error);
197#if CSV_EXCEPTIONS_ENABLED
198 template<
typename FieldAt>
199 std::string row_to_json(
size_t field_count, FieldAt field_at,
200 const std::vector<std::string>& subset)
const {
202 auto out = try_row_to_json(field_count, field_at, subset, error);
207 template<
typename FieldAt>
208 std::string row_to_json_array(
size_t field_count, FieldAt field_at,
209 const std::vector<std::string>& subset)
const {
211 auto out = try_row_to_json_array(field_count, field_at, subset, error);
218 template<
typename FieldAt>
219 std::string row_to_json_all(
size_t field_count, FieldAt field_at)
const {
220 const size_t count = (field_count < escaped_object_keys_.size()) ? field_count : escaped_object_keys_.size();
221 std::string out =
"{";
223 for (
size_t i = 0; i < count; ++i) {
224 out += escaped_object_keys_[i];
225 this->append_json_value(out, field_at(i));
235 template<
typename FieldAt>
236 std::string row_to_json_subset(
239 const std::vector<std::string>& subset,
CSVError& error
241 std::string out =
"{";
244 for (
const auto& column : subset) {
245 const size_t index = this->index_of(column, error);
246 if (error)
return {};
247 if (index >= field_count) {
255 out += escaped_object_keys_[index];
256 this->append_json_value(out, field_at(index));
264 template<
typename FieldAt>
265 std::string row_to_json_array_all(
size_t field_count, FieldAt field_at)
const {
266 const size_t count = (field_count < column_names_.size()) ? field_count : column_names_.size();
267 std::string out =
"[";
269 for (
size_t i = 0; i < count; ++i) {
270 this->append_json_value(out, field_at(i));
280 template<
typename FieldAt>
281 std::string row_to_json_array_subset(
284 const std::vector<std::string>& subset,
CSVError& error
286 std::string out =
"[";
289 for (
const auto& column : subset) {
290 const size_t index = this->index_of(column, error);
291 if (error)
return {};
292 if (index >= field_count) {
300 this->append_json_value(out, field_at(index));
309 const DataType type = internals::data_type(value);
318 append_json_escaped(out, value);
323 size_t index_of(
const std::string& column,
CSVError& error)
const {
324 const auto it = column_positions_.find(column);
325 if (it == column_positions_.end()) {
327 make_prefixed_message(ERROR_COLUMN_NOT_FOUND, column));
334 std::vector<std::string> column_names_;
335 std::vector<std::string> escaped_object_keys_;
336 std::unordered_map<std::string, size_t> column_positions_;