ソースを参照

get val is ok

pikastech 3 年 前
コミット
d04b07b517

+ 1 - 0
port/linux/package/pikascript/pika_cjson.pyi

@@ -26,3 +26,4 @@ class cJSON(TinyObj):
     def getValueInt(self) -> int: ...
     def getValueDouble(self) -> float: ...
     def getString(self) -> str: ...
+    def getValue(self) -> any: ...

+ 24 - 0
port/linux/package/pikascript/pikascript-lib/pika_cjson/pika_cjson_cJSON.c

@@ -116,3 +116,27 @@ char* pika_cjson_cJSON_getValueString(PikaObj* self) {
     cJSON* item = obj_getPtr(self, "item");
     return item->valuestring;
 }
+
+Arg* pika_cjson_cJSON_getValue(PikaObj* self) {
+    cJSON* item = obj_getPtr(self, "item");
+    int type = item->type;
+    if (type == cJSON_Invalid) {
+        return arg_setNull(NULL);
+    }
+    if (type == cJSON_False) {
+        return arg_setInt(NULL, "", 0);
+    }
+    if (type == cJSON_True) {
+        return arg_setInt(NULL, "", 1);
+    }
+    if (type == cJSON_NULL) {
+        return arg_setNull(NULL);
+    }
+    if (type == cJSON_Number) {
+        return arg_setFloat(NULL, "", item->valuedouble);
+    }
+    if (type == cJSON_String) {
+        return arg_setStr(NULL, "", item->valuestring);
+    }
+    return arg_setNull(NULL);
+}

+ 43 - 1
port/linux/test/cJSON-test.cpp

@@ -117,4 +117,46 @@ TEST(cJSON, next) {
     /* deinit */
     obj_deinit(pikaMain);
     EXPECT_EQ(pikaMemNow(), 0);
-}
+}
+
+TEST(cJSON, next_get_value) {
+    /* init */
+    pikaMemInfo.heapUsedMax = 0;
+    PikaObj* pikaMain = newRootObj("pikaMain", New_PikaMain);
+    char testjson[] =
+        "{\n"
+        "\"name\": \"mculover666\",\n"
+        "\"age\": 22,\n"
+        "\"weight\": 55.5,\n"
+        "\"address\":\n"
+        "{\n"
+        "    \"country\": \"China\",\n"
+        "    \"zip-code\": 111111\n"
+        "},\n"
+        "\"skill\": [\"c\", \"Java\", \"Python\"],\n"
+        "\"student\": false\n"
+        "}\n";
+    /* run */
+    obj_setStr(pikaMain, "testjson", testjson);
+    __platform_printf("BEGIN\r\n");
+    obj_run(pikaMain,
+            "a = pika_cjson.cJSON()\n"
+            "a.parse(testjson)\n"
+            "node = a.getChild()\n"
+            "val = PikaStdData.List()\n"
+            "for i in range(0, 3):\n"
+            "    val.append(node.getValue())\n"
+            "    node = node.getNext()\n"
+            "for item in val:\n"
+            "    print(item)\n"
+            "\n");
+    /* collect */
+    /* assert */
+    EXPECT_STREQ(log_buff[3], "BEGIN\r\n");
+    EXPECT_STREQ(log_buff[2], "mculover666\r\n");
+    EXPECT_STREQ(log_buff[1], "22.000000\r\n");
+    EXPECT_STREQ(log_buff[0], "55.500000\r\n");
+    /* deinit */
+    obj_deinit(pikaMain);
+    EXPECT_EQ(pikaMemNow(), 0);
+}