json: fix parsing first array-array element

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

Signed-off-by: Michael Zimmermann <sigmaepsilon92@gmail.com>
This commit is contained in:
Michael Zimmermann 2021-06-16 23:26:19 +02:00 committed by Christopher Friedt
commit 5e7ef8be5a
3 changed files with 31 additions and 8 deletions

View file

@ -360,11 +360,14 @@ typedef int (*json_append_bytes_t)(const char *bytes, size_t len,
.offset = offsetof(struct_, \ .offset = offsetof(struct_, \
len_field_), \ len_field_), \
{ \ { \
.object = { \ .array = { \
.sub_descr = \ .element_descr = \
elem_descr_, \ elem_descr_, \
.sub_descr_len = \ .n_elements = \
elem_descr_len_, \ 1 + \
ZERO_OR_COMPILE_ERROR( \
elem_descr_len_ == 1 \
), \
}, \ }, \
}, \ }, \
} }, \ } }, \

View file

@ -509,12 +509,18 @@ static int arr_parse(struct json_obj *obj,
{ {
ptrdiff_t elem_size = get_elem_size(elem_descr); ptrdiff_t elem_size = get_elem_size(elem_descr);
void *last_elem = (char *)field + elem_size * max_elements; 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; struct token value;
if (val) {
elements = (size_t *)((char *)val + elem_descr->offset);
}
__ASSERT_NO_MSG(elem_size > 0); __ASSERT_NO_MSG(elem_size > 0);
*elements = 0; if (elements) {
*elements = 0;
}
while (!arr_next(obj, &value)) { while (!arr_next(obj, &value)) {
if (value.type == JSON_TOK_LIST_END) { if (value.type == JSON_TOK_LIST_END) {
@ -525,11 +531,13 @@ static int arr_parse(struct json_obj *obj,
return -ENOSPC; return -ENOSPC;
} }
if (decode_value(obj, elem_descr, &value, field, val) < 0) { if (decode_value(obj, elem_descr, &value, field, NULL) < 0) {
return -EINVAL; return -EINVAL;
} }
(*elements)++; if (elements) {
(*elements)++;
}
field = (char *)field + elem_size; field = (char *)field + elem_size;
} }

View file

@ -232,8 +232,20 @@ static void test_json_decoding_array_array(void)
&obj_array_array_ts); &obj_array_array_ts);
zassert_equal(ret, 1, "Encoding array of object returned no errors"); 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, zassert_true(!strcmp(obj_array_array_ts.objects_array[1].objects.name,
"Pelé"), "String decoded correctly"); "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, zassert_equal(obj_array_array_ts.objects_array[2].objects.height, 195,
"Usain Bolt height decoded correctly"); "Usain Bolt height decoded correctly");
} }