Browse Source

Add null value handling

- Add null value handling with JsonObjectType specification
- Add test for invalid field values
Alexey Edelev 4 years ago
parent
commit
a94dc38b8c
2 changed files with 42 additions and 0 deletions
  1. 8 0
      microjson.cpp
  2. 34 0
      tests/main.cpp

+ 8 - 0
microjson.cpp

@@ -128,6 +128,7 @@ void lookForValue(const char *buffer, size_t size, size_t &i, microjson::JsonPro
     int valueBracketsCounter = -1;
     int trueCounter = 3;
     int falseCounter = 4;
+    int nullCounter = 3;
 
     std::function<bool(void)> valueEndMarker;
     bool beginFound = false;
@@ -216,6 +217,13 @@ void lookForValue(const char *buffer, size_t size, size_t &i, microjson::JsonPro
                 };
                 property.type = microjson::JsonBoolType;
                 break;
+            case 'n':
+                valueEndMarker = [&nullCounter](){
+                    --nullCounter;
+                    return nullCounter == 0;
+                };
+                property.type = microjson::JsonObjectType;
+                break;
             case '[':
                 valueBracketsCounter++;
                 valueEndMarker = [&stringScope, &byte, &valueBracketsCounter](){

+ 34 - 0
tests/main.cpp

@@ -792,3 +792,37 @@ TEST_F(MicrojsonDeserializationTest, MixedStringValue) {
     EXPECT_EQ(it->second.type, microjson::JsonObjectType);
     EXPECT_STREQ(it->second.value.c_str(), "{\"test]Fiel]d1}\":[\"[[test2\",\"}test{{2\"]}");
 }
+
+TEST_F(MicrojsonDeserializationTest, TestInvalidValues) {
+    const char *buffer1 = "{\"testField1\":null}";
+    size_t size = strlen(buffer1);
+    microjson::JsonObject obj = microjson::parseJsonObject(buffer1, size);
+    auto it = obj.find("testField1");
+    ASSERT_TRUE(it != obj.end());
+    EXPECT_EQ(it->second.type, microjson::JsonObjectType);
+    EXPECT_STREQ(it->second.value.c_str(), "null");
+
+    const char *buffer2 = "{\"testField1\":\"NaN\"}";
+    size = strlen(buffer2);
+    obj = microjson::parseJsonObject(buffer2, size);
+    it = obj.find("testField1");
+    ASSERT_TRUE(it != obj.end());
+    EXPECT_EQ(it->second.type, microjson::JsonStringType);
+    EXPECT_STREQ(it->second.value.c_str(), "NaN");
+
+    const char *buffer3 = "{\"testField1\":\"Infinity\"}";
+    size = strlen(buffer3);
+    obj = microjson::parseJsonObject(buffer3, size);
+    it = obj.find("testField1");
+    ASSERT_TRUE(it != obj.end());
+    EXPECT_EQ(it->second.type, microjson::JsonStringType);
+    EXPECT_STREQ(it->second.value.c_str(), "Infinity");
+
+    const char *buffer4 = "{\"testField1\":\"-Infinity\"}";
+    size = strlen(buffer4);
+    obj = microjson::parseJsonObject(buffer4, size);
+    it = obj.find("testField1");
+    ASSERT_TRUE(it != obj.end());
+    EXPECT_EQ(it->second.type, microjson::JsonStringType);
+    EXPECT_STREQ(it->second.value.c_str(), "-Infinity");
+}