From 795655edda5e23a5705917440e8d7e8b6ca0be80 Mon Sep 17 00:00:00 2001 From: Christos Choutouridis Date: Sun, 6 Feb 2022 23:41:39 +0200 Subject: [PATCH] FIX: json decoder bug jdec was crashing when string had spaces --- include/utils/json.h | 58 ++++++++++++++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 18 deletions(-) diff --git a/include/utils/json.h b/include/utils/json.h index fa82e48..27284b7 100644 --- a/include/utils/json.h +++ b/include/utils/json.h @@ -49,6 +49,8 @@ struct json_dec_t { size_t pairs =0; char* begin = nullptr; int s =0; + bool str_value = false; // flag to indicate the value is string + for (size_t i=0 ; i 0) - pairs_[pairs].value = std::string_view{begin, (size_t)s}; - else - pairs_[pairs].value = std::string_view{}; - ++pairs; - begin =nullptr; - s =0; - if (std::isspace(buffer[i])) + else if (!begin && !std::isspace(buffer[i])) { // first character + if (buffer[i] == '\"') { + begin = (char*)&buffer[i+1]; + str_value = true; + } + else { + begin = (char*)&buffer[i]; + str_value = false; + } + } + else if (begin) { + if (str_value && (buffer[i] == '\"')) { + s = (char*)&buffer[i] - begin; + if (s > 0) + pairs_[pairs].value = std::string_view{begin, (size_t)s}; + else + pairs_[pairs].value = std::string_view{}; + ++pairs; + begin =nullptr; + s =0; state = SP; - else if (buffer[i] == ',') - state = KEY; - else if (buffer[i] == '}') - return; + } + else if (!str_value && (std::isspace(buffer[i]) || buffer[i] == ',' || buffer[i] == '}')) { + s = (char*)&buffer[i] - begin; + if (s > 0) + pairs_[pairs].value = std::string_view{begin, (size_t)s}; + else + pairs_[pairs].value = std::string_view{}; + ++pairs; + begin =nullptr; + s =0; + if (std::isspace(buffer[i])) + state = SP; + else if (buffer[i] == ',') + state = KEY; + else if (buffer[i] == '}') + return; + } } break;