REST: sd_bus_message->JSON: fix multiple entries

When convertDBusToJSON processed an sd_bus_message with
a signature that had multiple high level entries, the
handler code tried to reassign a reference variable to
a new array entry, but references can't be reassigned,
so all it did was reset the passed in JSON object to
the empty value at the end of the array.

Instead, do this with a pointer.

Tested: A message with a signature of "sa{sv}as" was failing,
with nlohmann::json complaining about trying to do a
push_back on a string object.  With this fix, that no longer
happens.

Change-Id: Idb3d3a56f0bd38f559f96f828ad95db65bbd11e1
Signed-off-by: Matt Spinler <spinler@us.ibm.com>
diff --git a/include/openbmc_dbus_rest.hpp b/include/openbmc_dbus_rest.hpp
index 5a00572..907febb 100644
--- a/include/openbmc_dbus_rest.hpp
+++ b/include/openbmc_dbus_rest.hpp
@@ -1037,18 +1037,18 @@
     int r = 0;
     const std::vector<std::string> returnTypes = dbusArgSplit(returnType);
 
-    nlohmann::json &thisElement = response;
     for (const std::string &typeCode : returnTypes)
     {
-        if (returnType.size() > 1)
+        nlohmann::json *thisElement = &response;
+        if (returnTypes.size() > 1)
         {
             response.push_back(nlohmann::json{});
-            thisElement = response.back();
+            thisElement = &response.back();
         }
 
         if (typeCode == "s")
         {
-            r = readMessageItem<char *>(typeCode, m, thisElement);
+            r = readMessageItem<char *>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1056,7 +1056,7 @@
         }
         else if (typeCode == "g")
         {
-            r = readMessageItem<char *>(typeCode, m, thisElement);
+            r = readMessageItem<char *>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1064,7 +1064,7 @@
         }
         else if (typeCode == "o")
         {
-            r = readMessageItem<char *>(typeCode, m, thisElement);
+            r = readMessageItem<char *>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1072,17 +1072,17 @@
         }
         else if (typeCode == "b")
         {
-            r = readMessageItem<int>(typeCode, m, thisElement);
+            r = readMessageItem<int>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
             }
 
-            thisElement = static_cast<bool>(thisElement.get<int>());
+            *thisElement = static_cast<bool>(thisElement->get<int>());
         }
         else if (typeCode == "u")
         {
-            r = readMessageItem<uint32_t>(typeCode, m, thisElement);
+            r = readMessageItem<uint32_t>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1090,7 +1090,7 @@
         }
         else if (typeCode == "i")
         {
-            r = readMessageItem<int32_t>(typeCode, m, thisElement);
+            r = readMessageItem<int32_t>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1098,7 +1098,7 @@
         }
         else if (typeCode == "x")
         {
-            r = readMessageItem<int64_t>(typeCode, m, thisElement);
+            r = readMessageItem<int64_t>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1106,7 +1106,7 @@
         }
         else if (typeCode == "t")
         {
-            r = readMessageItem<uint64_t>(typeCode, m, thisElement);
+            r = readMessageItem<uint64_t>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1114,7 +1114,7 @@
         }
         else if (typeCode == "n")
         {
-            r = readMessageItem<int16_t>(typeCode, m, thisElement);
+            r = readMessageItem<int16_t>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1122,7 +1122,7 @@
         }
         else if (typeCode == "q")
         {
-            r = readMessageItem<uint16_t>(typeCode, m, thisElement);
+            r = readMessageItem<uint16_t>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1130,7 +1130,7 @@
         }
         else if (typeCode == "y")
         {
-            r = readMessageItem<uint8_t>(typeCode, m, thisElement);
+            r = readMessageItem<uint8_t>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1138,7 +1138,7 @@
         }
         else if (typeCode == "d")
         {
-            r = readMessageItem<double>(typeCode, m, thisElement);
+            r = readMessageItem<double>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1146,7 +1146,7 @@
         }
         else if (typeCode == "h")
         {
-            r = readMessageItem<int>(typeCode, m, thisElement);
+            r = readMessageItem<int>(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1154,7 +1154,7 @@
         }
         else if (boost::starts_with(typeCode, "a"))
         {
-            r = readArrayFromMessage(typeCode, m, thisElement);
+            r = readArrayFromMessage(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1163,7 +1163,7 @@
         else if (boost::starts_with(typeCode, "(") &&
                  boost::ends_with(typeCode, ")"))
         {
-            r = readStructFromMessage(typeCode, m, thisElement);
+            r = readStructFromMessage(typeCode, m, *thisElement);
             if (r < 0)
             {
                 return r;
@@ -1171,7 +1171,7 @@
         }
         else if (boost::starts_with(typeCode, "v"))
         {
-            r = readVariantFromMessage(m, thisElement);
+            r = readVariantFromMessage(m, *thisElement);
             if (r < 0)
             {
                 return r;