From 5e7ef8be5a4054f6abeb7993d519b578bb7d3e41 Mon Sep 17 00:00:00 2001 From: Michael Zimmermann Date: Wed, 16 Jun 2021 23:26:19 +0200 Subject: [PATCH] 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 --- include/data/json.h | 11 +++++++---- lib/os/json.c | 16 ++++++++++++---- tests/lib/json/src/main.c | 12 ++++++++++++ 3 files changed, 31 insertions(+), 8 deletions(-) diff --git a/include/data/json.h b/include/data/json.h index 43a5ed27a3f..5b36ef79710 100644 --- a/include/data/json.h +++ b/include/data/json.h @@ -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 \ + ), \ }, \ }, \ } }, \ diff --git a/lib/os/json.c b/lib/os/json.c index 69d3d614c90..df52d13c13a 100644 --- a/lib/os/json.c +++ b/lib/os/json.c @@ -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); - *elements = 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; } - (*elements)++; + if (elements) { + (*elements)++; + } field = (char *)field + elem_size; } diff --git a/tests/lib/json/src/main.c b/tests/lib/json/src/main.c index 97a94f14213..42ad1520b9f 100644 --- a/tests/lib/json/src/main.c +++ b/tests/lib/json/src/main.c @@ -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"); }