Fix bug in json to xml convert library
authorEduardo Ramos Testillano (eramedu) <eduardo.ramos.testillano@ericsson.com>
Mon, 4 May 2020 17:36:17 +0000 (19:36 +0200)
committerEduardo Ramos Testillano (eramedu) <eduardo.ramos.testillano@ericsson.com>
Mon, 4 May 2020 17:36:17 +0000 (19:36 +0200)
Bad management for node-names stack (FIFO).
Both object and array shall push keys and also shall pop them
when entering/finishing the callbacks.
Also, new member key_ will store the key (and it won't be
pushed when detected, only when starting object/array).

include/anna/json/SaxConsumer.hpp

index 110a097..33473ed 100644 (file)
@@ -26,6 +26,7 @@ class SaxConsumer : public nlohmann::json::json_sax_t
   std::stringstream result_;
   std::stringstream current_object_;
   std::stack<std::string> nodes_stack_;
+  std::string key_;
 
   public:
 
@@ -71,6 +72,7 @@ class SaxConsumer : public nlohmann::json::json_sax_t
 
   bool start_object(std::size_t elements) override
   {
+    nodes_stack_.push(key_);
     if (!started_) { started_ = true ; return true; } // ignore first start object (which is whole json object {)
     indent_ += ANNA_XML_INDENTATION_SPACES;
     result_ << std::string(indent_, ' ') << "<" << nodes_stack_.top();
@@ -87,11 +89,13 @@ class SaxConsumer : public nlohmann::json::json_sax_t
     if (close == "") result_ << "</" << nodes_stack_.top() << ">";
     result_ << "\n";
     current_object_.str("");
+    nodes_stack_.pop();
     return true;
   }
 
   bool start_array(std::size_t elements) override
   {
+    nodes_stack_.push(key_);
     result_ << current_object_.str() << ">\n";
     current_object_.str("");
     return true;
@@ -107,7 +111,7 @@ class SaxConsumer : public nlohmann::json::json_sax_t
   bool key(string_t& val) override
   {
     if (val[0] != '@') {
-      nodes_stack_.push(val);
+      key_ = val;
     }
     else {
       current_object_ << " " << val.substr(1) << "=";