Skip to content

Commit fa59298

Browse files
Added explicit null for json parser, and also added tests to verify null behavior. (aws#28)
1 parent c1e9cf5 commit fa59298

File tree

4 files changed

+86
-0
lines changed

4 files changed

+86
-0
lines changed

include/aws/crt/JsonObject.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,11 @@ namespace Aws
154154
*/
155155
JsonObject &AsArray(Vector<JsonObject> &&array);
156156

157+
/**
158+
* Sets the current JSON node as null.
159+
*/
160+
JsonObject &AsNull();
161+
157162
/**
158163
* Adds a JSON object to the top level of this node at key.
159164
* The object parameter is deep-copied.

source/JsonObject.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,12 @@ namespace Aws
281281
return *this;
282282
}
283283

284+
JsonObject &JsonObject::AsNull()
285+
{
286+
m_value = cJSON_CreateNull();
287+
return *this;
288+
}
289+
284290
JsonObject &JsonObject::WithObject(const char *key, const JsonObject &value)
285291
{
286292
if (m_value == nullptr)

tests/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ add_test_case(ClientBootstrapResourceSafety)
1414
add_test_case(TLSContextResourceSafety)
1515
add_test_case(DateTimeBinding)
1616
add_test_case(BasicJsonParsing)
17+
add_test_case(JsonNullParsing)
18+
add_test_case(JsonNullNestedObject)
19+
add_test_case(JsonExplicitNull)
1720
add_test_case(SHA256ResourceSafety)
1821
add_test_case(MD5ResourceSafety)
1922
add_test_case(SHA256HMACResourceSafety)

tests/JsonParserTest.cpp

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,75 @@ static int s_BasicJsonParsing(struct aws_allocator *allocator, void *ctx)
4242
}
4343

4444
AWS_TEST_CASE(BasicJsonParsing, s_BasicJsonParsing)
45+
46+
static int s_JsonNullParseTest(struct aws_allocator *allocator, void *ctx)
47+
{
48+
(void)ctx;
49+
Aws::Crt::ApiHandle apiHandle(allocator);
50+
51+
const Aws::Crt::String jsonValue = "{\"testStringKey\":null,\"testIntKey\":10,"
52+
"\"array\":[null,\"stringArrayEntry\"],"
53+
"\"object\":{\"testObjectStringKey\":null}}";
54+
55+
Aws::Crt::JsonObject value(jsonValue);
56+
ASSERT_TRUE(value.WasParseSuccessful());
57+
58+
auto str = value.View().WriteCompact(true);
59+
ASSERT_STR_EQUALS(jsonValue.c_str(), str.c_str());
60+
str = value.View().WriteCompact(false);
61+
ASSERT_STR_EQUALS(jsonValue.c_str(), str.c_str());
62+
63+
return AWS_OP_SUCCESS;
64+
}
65+
66+
AWS_TEST_CASE(JsonNullParsing, s_JsonNullParseTest)
67+
68+
static int s_JsonNullNestedObjectTest(struct aws_allocator *allocator, void *ctx)
69+
{
70+
(void)ctx;
71+
Aws::Crt::ApiHandle apiHandle(allocator);
72+
73+
const Aws::Crt::String jsonValue = "{\"testStringKey\":null,\"testIntKey\":10,"
74+
"\"array\":[null,\"stringArrayEntry\"],"
75+
"\"object\":{\"testObjectStringKey\":null}}";
76+
77+
Aws::Crt::JsonObject value(jsonValue);
78+
ASSERT_TRUE(value.WasParseSuccessful());
79+
80+
Aws::Crt::JsonObject doc;
81+
doc.WithObject("null_members", jsonValue);
82+
83+
const Aws::Crt::String expectedValue = "{\"null_members\":{\"testStringKey\":null,\"testIntKey\":10,"
84+
"\"array\":[null,\"stringArrayEntry\"],"
85+
"\"object\":{\"testObjectStringKey\":null}}}";
86+
auto str = doc.View().WriteCompact(true);
87+
ASSERT_STR_EQUALS(expectedValue.c_str(), str.c_str());
88+
str = doc.View().WriteCompact(false);
89+
ASSERT_STR_EQUALS(expectedValue.c_str(), str.c_str());
90+
91+
return AWS_OP_SUCCESS;
92+
}
93+
94+
AWS_TEST_CASE(JsonNullNestedObject, s_JsonNullNestedObjectTest)
95+
96+
static int s_JsonExplicitNullTest(struct aws_allocator *allocator, void *ctx)
97+
{
98+
(void)ctx;
99+
Aws::Crt::ApiHandle apiHandle(allocator);
100+
101+
const Aws::Crt::String expectedValue = "{\"testKey\":null}";
102+
103+
Aws::Crt::JsonObject doc;
104+
Aws::Crt::JsonObject nullObject;
105+
nullObject.AsNull();
106+
doc.WithObject("testKey", nullObject);
107+
108+
auto str = doc.View().WriteCompact(true);
109+
ASSERT_STR_EQUALS(expectedValue.c_str(), str.c_str());
110+
str = doc.View().WriteCompact(false);
111+
ASSERT_STR_EQUALS(expectedValue.c_str(), str.c_str());
112+
113+
return AWS_OP_SUCCESS;
114+
}
115+
116+
AWS_TEST_CASE(JsonExplicitNull, s_JsonExplicitNullTest)

0 commit comments

Comments
 (0)