Commit 9bcf9b6a authored by Michael Zimmermann's avatar Michael Zimmermann Committed by Anas Nashif
Browse files

json: fix parsing first array-array element



Previously, the first element inside the array-array didn't contain the
decoded data.

Signed-off-by: default avatarMichael Zimmermann <sigmaepsilon92@gmail.com>
parent 2595cce7
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -360,11 +360,14 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
					.offset = offsetof(struct_, \
							   len_field_), \
					{ \
						.object = { \
							.sub_descr = \
						.array = { \
							.element_descr = \
								elem_descr_, \
							.sub_descr_len = \
							    elem_descr_len_, \
							.n_elements = \
								1 + \
								ZERO_OR_COMPILE_ERROR( \
									elem_descr_len_ == 1 \
								), \
						}, \
					}, \
				} }, \
+12 −4
Original line number Diff line number Diff line
@@ -509,12 +509,18 @@ static int arr_parse(struct json_obj *obj,
{
	ptrdiff_t elem_size = get_elem_size(elem_descr);
	void *last_elem = (char *)field + elem_size * max_elements;
	size_t *elements = (size_t *)((char *)val + elem_descr->offset);
	size_t *elements = NULL;
	struct token value;

	if (val) {
		elements = (size_t *)((char *)val + elem_descr->offset);
	}

	__ASSERT_NO_MSG(elem_size > 0);

	if (elements) {
		*elements = 0;
	}

	while (!arr_next(obj, &value)) {
		if (value.type == JSON_TOK_LIST_END) {
@@ -525,11 +531,13 @@ static int arr_parse(struct json_obj *obj,
			return -ENOSPC;
		}

		if (decode_value(obj, elem_descr, &value, field, val) < 0) {
		if (decode_value(obj, elem_descr, &value, field, NULL) < 0) {
			return -EINVAL;
		}

		if (elements) {
			(*elements)++;
		}
		field = (char *)field + elem_size;
	}

+12 −0
Original line number Diff line number Diff line
@@ -232,8 +232,20 @@ static void test_json_decoding_array_array(void)
			     &obj_array_array_ts);

	zassert_equal(ret, 1, "Encoding array of object returned no errors");
	zassert_equal(obj_array_array_ts.objects_array_len, 3, "Array has correct number of items");

	zassert_true(!strcmp(obj_array_array_ts.objects_array[0].objects.name,
			 "Simón Bolívar"), "String decoded correctly");
	zassert_equal(obj_array_array_ts.objects_array[0].objects.height, 168,
		      "Simón Bolívar height decoded correctly");

	zassert_true(!strcmp(obj_array_array_ts.objects_array[1].objects.name,
			 "Pelé"), "String decoded correctly");
	zassert_equal(obj_array_array_ts.objects_array[1].objects.height, 173,
		      "Pelé height decoded correctly");

	zassert_true(!strcmp(obj_array_array_ts.objects_array[2].objects.name,
			 "Usain Bolt"), "String decoded correctly");
	zassert_equal(obj_array_array_ts.objects_array[2].objects.height, 195,
		      "Usain Bolt height decoded correctly");
}