diff --git a/trunk/src/protocol/srs_protocol_json.cpp b/trunk/src/protocol/srs_protocol_json.cpp index f58766538..f7bd1c5ed 100644 --- a/trunk/src/protocol/srs_protocol_json.cpp +++ b/trunk/src/protocol/srs_protocol_json.cpp @@ -1970,9 +1970,10 @@ SrsJsonAny* SrsJsonArray::at(int index) return elem; } -void SrsJsonArray::add(SrsJsonAny* value) +SrsJsonArray* SrsJsonArray::add(SrsJsonAny* value) { properties.push_back(value); + return this; } SrsJsonArray* SrsJsonArray::append(SrsJsonAny* value) diff --git a/trunk/src/protocol/srs_protocol_json.hpp b/trunk/src/protocol/srs_protocol_json.hpp index 1eedd9b23..0e3d8cab0 100644 --- a/trunk/src/protocol/srs_protocol_json.hpp +++ b/trunk/src/protocol/srs_protocol_json.hpp @@ -156,7 +156,7 @@ public: virtual int count(); // @remark: max index is count(). virtual SrsJsonAny* at(int index); - virtual void add(SrsJsonAny* value); + virtual SrsJsonArray* add(SrsJsonAny* value); // alias to add. virtual SrsJsonArray* append(SrsJsonAny* value); public: diff --git a/trunk/src/utest/srs_utest_amf0.cpp b/trunk/src/utest/srs_utest_amf0.cpp index d92efd289..aa6a2a607 100644 --- a/trunk/src/utest/srs_utest_amf0.cpp +++ b/trunk/src/utest/srs_utest_amf0.cpp @@ -2621,6 +2621,20 @@ VOID TEST(ProtocolJSONTest, Dumps) EXPECT_STREQ("[]", p->dumps().c_str()); srs_freep(p); } + + if (true) { + SrsJsonObject* p = SrsJsonAny::object(); + p->set("id", SrsJsonAny::integer(3)); + EXPECT_STREQ("{\"id\":3}", p->dumps().c_str()); + srs_freep(p); + } + + if (true) { + SrsJsonArray* p = SrsJsonAny::array(); + p->add(SrsJsonAny::integer(3)); + EXPECT_STREQ("[3]", p->dumps().c_str()); + srs_freep(p); + } } VOID TEST(ProtocolJSONTest, Parse) @@ -2680,3 +2694,78 @@ VOID TEST(ProtocolJSONTest, Parse) } } +VOID TEST(ProtocolJSONTest, ObjectAPI) +{ + SrsJsonObject* p = SrsJsonAny::object(); + SrsAutoFree(SrsJsonObject, p); + + p->set("id", SrsJsonAny::integer(3)); + p->set("name", SrsJsonAny::str("srs")); + + EXPECT_STREQ("name", p->key_at(1).c_str()); + EXPECT_STREQ("srs", p->value_at(1)->to_str().c_str()); + + p->set("name", NULL); + p->set("name", SrsJsonAny::str("ossrs")); + p->set("version", SrsJsonAny::number(3.1)); + p->set("stable", SrsJsonAny::boolean(true)); + + SrsJsonObject* pp = SrsJsonAny::object(); + p->set("args", pp); + pp->set("url", SrsJsonAny::str("ossrs.net")); + pp->set("year", SrsJsonAny::integer(2019)); + + SrsJsonArray* pa = SrsJsonAny::array(); + p->set("authors", pa); + pa->add(SrsJsonAny::str("winlin")); + pa->add(SrsJsonAny::str("wenjie")); + + SrsJsonAny* prop = p->get_property("name"); + EXPECT_STREQ("ossrs", prop->to_str().c_str()); + EXPECT_STREQ("ossrs", p->ensure_property_string("name")->to_str().c_str()); + + EXPECT_TRUE(NULL == p->get_property("invalid")); + EXPECT_TRUE(NULL == p->ensure_property_string("invalid")); + EXPECT_TRUE(NULL == p->ensure_property_string("id")); + + EXPECT_TRUE(NULL == p->ensure_property_integer("invalid")); + EXPECT_TRUE(NULL == p->ensure_property_integer("name")); + EXPECT_EQ(3, p->ensure_property_integer("id")->to_integer()); + + EXPECT_TRUE(NULL == p->ensure_property_number("invalid")); + EXPECT_TRUE(NULL == p->ensure_property_number("name")); + EXPECT_EQ(3.1, p->ensure_property_number("version")->to_number()); + + EXPECT_TRUE(NULL == p->ensure_property_boolean("invalid")); + EXPECT_TRUE(NULL == p->ensure_property_boolean("name")); + EXPECT_TRUE(p->ensure_property_boolean("stable")->to_boolean()); + + EXPECT_TRUE(NULL == p->ensure_property_object("invalid")); + EXPECT_TRUE(NULL == p->ensure_property_object("name")); + EXPECT_TRUE(NULL != p->ensure_property_object("args")->to_object()); + + EXPECT_TRUE(NULL == p->ensure_property_array("invalid")); + EXPECT_TRUE(NULL == p->ensure_property_array("name")); + EXPECT_TRUE(NULL != p->ensure_property_array("authors")->to_array()); + + SrsAmf0Object* a = (SrsAmf0Object*)p->to_amf0(); + EXPECT_EQ(6, a->count()); + srs_freep(a); +} + +VOID TEST(ProtocolJSONTest, ArrayAPI) +{ + SrsJsonArray* p = SrsJsonAny::array(); + SrsAutoFree(SrsJsonArray, p); + + p->add(SrsJsonAny::integer(2019)); + p->add(SrsJsonAny::str("srs")); + p->add(SrsJsonAny::boolean(true)); + + EXPECT_STREQ("srs", p->at(1)->to_str().c_str()); + + SrsAmf0StrictArray* a = (SrsAmf0StrictArray*)p->to_amf0(); + EXPECT_EQ(3, a->count()); + srs_freep(a); +} +