Explorar o código

Implement json serialzation of complex lists

- Add tests
Alexey Edelev %!s(int64=4) %!d(string=hai) anos
pai
achega
c8924277e3

+ 19 - 5
src/protobuf/qprotobufjsonserializer.cpp

@@ -270,8 +270,24 @@ public:
                 QByteArray value = QByteArray::fromStdString(property.second.value);
                 if (handler.deserializer) {
                     QVariant newValue;
-                    QtProtobuf::QProtobufSelfcheckIterator it(value);
-                    handler.deserializer(qPtr, it, newValue);
+                    if (property.second.type == microjson::JsonArrayType) {
+                        microjson::JsonArray arrayValues = microjson::parseJsonArray(property.second.value.data(), property.second.value.size());
+                        if (arrayValues.size() > 0) {
+                            if (arrayValues[0].type == microjson::JsonObjectType) {
+                                for (auto &arrayValue : arrayValues) {
+                                    QByteArray arrayBuffer = QByteArray::fromStdString(arrayValue.value);
+                                    QtProtobuf::QProtobufSelfcheckIterator it(arrayBuffer);
+                                    handler.deserializer(qPtr, it, newValue);
+                                }
+                            } else {
+                                QtProtobuf::QProtobufSelfcheckIterator it(value);
+                                handler.deserializer(qPtr, it, newValue);
+                            }
+                        }
+                    } else {
+                        QtProtobuf::QProtobufSelfcheckIterator it(value);
+                        handler.deserializer(qPtr, it, newValue);
+                    }
                     object->setProperty(name.c_str(), newValue);
                 } else {
                     auto handler = handlers.find(metaProperty.userType());
@@ -338,9 +354,7 @@ QByteArray QProtobufJsonSerializer::serializeListEnd(QByteArray &buffer, const Q
 
 void QProtobufJsonSerializer::deserializeListObject(QObject *object, const QProtobufMetaObject &metaObject, QProtobufSelfcheckIterator &it) const
 {
-    Q_UNUSED(object)
-    Q_UNUSED(it)
-    Q_UNUSED(metaObject)
+    dPtr->deserializeObject(object, metaObject, it.data(), it.size());
 }
 
 QByteArray QProtobufJsonSerializer::serializeMapBegin(const QProtobufMetaProperty &/*metaProperty*/) const

+ 14 - 16
tests/test_protobuf/jsondeserializationtest.cpp

@@ -410,23 +410,21 @@ TEST_F(JsonDeserializationTest, SimpleEnumListMessageTest)
     EXPECT_TRUE(test.localEnumList().isEmpty());
 }
 
-//TEST_F(JsonDeserializationTest, RepeatedComplexMessageTest)
-//{
-//    SimpleStringMessage stringMsg;
-//    stringMsg.setTestFieldString("qwerty");
-//    QSharedPointer<ComplexMessage> msg(new ComplexMessage);
-//    msg->setTestFieldInt(25);
-//    msg->setTestComplexField(stringMsg);
-//    RepeatedComplexMessage test;
-//    test.setTestRepeatedComplex({msg, msg, msg});
-//    QByteArray result = test.serialize(serializer.get());
-//    EXPECT_TRUE(QString::fromUtf8(result).toStdString() == "{\"testRepeatedComplex\":[{\"testComplexField\":{\"testFieldString\":\"qwerty\"},\"testFieldInt\":25},{\"testComplexField\":{\"testFieldString\":\"qwerty\"},\"testFieldInt\":25},{\"testComplexField\":{\"testFieldString\":\"qwerty\"},\"testFieldInt\":25}]}"
-//                 || QString::fromUtf8(result).toStdString() == "{\"testRepeatedComplex\":[{\"testFieldInt\":25,\"testComplexField\":{\"testFieldString\":\"qwerty\"}},{\"testFieldInt\":25,\"testComplexField\":{\"testFieldString\":\"qwerty\"}},{\"testFieldInt\":25,\"testComplexField\":{\"testFieldString\":\"qwerty\"}}]}");
+TEST_F(JsonDeserializationTest, RepeatedComplexMessageTest)
+{
+    RepeatedComplexMessage test;
+    test.deserialize(serializer.get(), "{\"testRepeatedComplex\":[{\"testComplexField\":{\"testFieldString\":\"qwerty\"},\"testFieldInt\":25},{\"testComplexField\":{\"testFieldString\":\"qwerty\"},\"testFieldInt\":25},{\"testComplexField\":{\"testFieldString\":\"qwerty\"},\"testFieldInt\":25}]}");
+    ASSERT_EQ(test.testRepeatedComplex().size(), 3);
+    EXPECT_EQ(test.testRepeatedComplex()[0]->testFieldInt(), 25);
+    EXPECT_EQ(test.testRepeatedComplex()[1]->testFieldInt(), 25);
+    EXPECT_EQ(test.testRepeatedComplex()[2]->testFieldInt(), 25);
+    EXPECT_STREQ(test.testRepeatedComplex()[0]->testComplexField().testFieldString().toStdString().c_str(), "qwerty");
+    EXPECT_STREQ(test.testRepeatedComplex()[1]->testComplexField().testFieldString().toStdString().c_str(), "qwerty");
+    EXPECT_STREQ(test.testRepeatedComplex()[2]->testComplexField().testFieldString().toStdString().c_str(), "qwerty");
 
-//    test.setTestRepeatedComplex({});
-//    result = test.serialize(serializer.get());
-//    EXPECT_STREQ(QString::fromUtf8(result).toStdString().c_str(), "{\"testRepeatedComplex\":[]}");
-//}
+    test.deserialize(serializer.get(), "{\"testRepeatedComplex\":[]}");
+    EXPECT_TRUE(test.testRepeatedComplex().isEmpty());
+}
 
 //TEST_F(JsonDeserializationTest, SimpleFixed32StringMapSerializeTest)
 //{