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:
parent
ed76b915cb
commit
5e7ef8be5a
3 changed files with 31 additions and 8 deletions
|
@ -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 \
|
||||||
|
), \
|
||||||
}, \
|
}, \
|
||||||
}, \
|
}, \
|
||||||
} }, \
|
} }, \
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue