−1
- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
jsonObj_t *__jsonLoad(const char *_str_json, size_t _len_str_json, jsonErr_t *_error) {
jsonObj_t *obj_json = NULL;
jsonObj_t *obj_json_children = NULL; // Тут будет зиждется объект
jsonObj_t *obj_json_tmp = NULL; // Тут будет зиждется объект
size_t index_in_json_str = 0;
size_t len_key = 0; // Размер извлекаемого ключа
size_t len_value = 0; // Размер извлекаемого значения
size_t count_hooks = 0; // Счётчик скобок, чтобы игнорировать их при чтении объекта
uint8_t flag_found_separator = 0; // Флаг чтения ключа
uint8_t flag_found_start = 0; // Флаг начало JSON-объекта
// uint8_t flag_found_end = 0; // Флаг окончания JSON-объекта
uint8_t flag_read_key = 0; // Флаг чтения ключа
uint8_t flag_read_force_read = 0; // Флаг-костыль для ситуаций, когда число последнее в массиве
uint8_t flag_read_value = 0; // Флаг чтения значения
uint8_t flag_read_array = 0; // Флаг чтения и обработки массива
uint8_t flag_want_value = 0; // Флаг ожидания значения
// (выставляется после успешно прочитанного ключа)
jsonErr_t json_err = JSON_OK;
int res = 0;
jsonValueType_t type_expected_value = JSON_VALUE_NONE; // Ожидаемы тип считываемого значения
char chr_open = '\0';
char chr_close = '\0';
const char *ptr_key = NULL; // Указатель на начало извлекаемого ключа
const char *ptr_value = NULL; // Указатель на начало извлекаемого значения
if (_error != NULL)
{
*_error = JSON_OK;
}
for (index_in_json_str = 0; index_in_json_str < _len_str_json; ++index_in_json_str)
{
// Если начало JSON-объекта не найдено, то пропускать
if (flag_found_start == 0)
{
// Поиск начала JSON-объекта
if (_str_json[index_in_json_str] == '{')
{
flag_found_start = 1;
}
if (_str_json[index_in_json_str] == '[')
{
flag_found_start = 1;
flag_read_array = 1;
flag_want_value = 1;
flag_found_separator = 1; // Сразу после знака "[" ожидается значение
}
continue;
}
// Обработка ключа
if ((flag_read_key == 0) &&\
(flag_read_value == 0) &&\
(flag_want_value == 0) &&\
(flag_read_array == 0))
{
if (((_str_json[index_in_json_str] == '\"') || (_str_json[index_in_json_str] == '\'')))
{
chr_close = _str_json[index_in_json_str];
flag_read_key = 1; // Флаг начало чтения ключа
if ((index_in_json_str + 1) != _len_str_json)
{
ptr_value = (const char *)(_str_json + index_in_json_str + 1);
len_value = 1;
}
else
{
if (_error != NULL)
{
*_error = JSON_ERR_BAD_JSON;
}
jsonFree(obj_json);
return (NULL);
}
}
continue;
}
// Обработка значения
if ((flag_want_value == 1) && (flag_read_value == 0))
{
// Поиск разделителя ключа и значения
if (flag_found_separator == 0)
{
if ((_str_json[index_in_json_str] == ']') && (flag_read_array == 1))
{
// flag_found_end = 1;
Либа продакшеновая, эта функция около 470 строк кода, всё не вместилось... Нет, индусов у нас нет, как и ответственного за качество кода тоже) и да это ещё один парсер. Опирается ли он на спецификацию JSON? Нет конечно же, боже упаси, зачем? Зато она прекрасно понимает TRUE как true и FALSE как false, а ваши жалкие либы такого не могут
Запостил: viktorokh96,
28 Октября 2020
dima201246 28.10.2020 22:20 # −1
rotoeb 28.10.2020 22:31 # +3
guest8 28.10.2020 22:44 # −1
rotoeb 28.10.2020 22:45 # +3
bormand 29.10.2020 15:17 # −1
viktorokh96 28.10.2020 22:51 # 0
bormand 29.10.2020 15:20 # 0
Вай нот? При парсинге жсона нету особого смысла декодить utf-8, всякие кавычки да слеши всё равно однобайтовые и с теми же кодами, что и в ascii. Достаточно проверить, что битых и неканоничных последовательностей нету. Ну и \u и \x раскрыть в utf-8 последовательности.
guest8 29.10.2020 16:06 # +1
bormand 29.10.2020 16:10 # 0
А если дело до реальной поддержки юникода дойдёт, то перевод во всякие wchar_t ничем тебе не поможет. Всё равно понадобится какое-нибудь icu. А оно и utf-8 хавает.
guest8 29.10.2020 16:45 # −999
bormand 29.10.2020 16:47 # 0
strstr(s, u8"хуй") без проблем работает.
guest8 29.10.2020 16:52 # −999
bormand 29.10.2020 16:56 # 0
bormand 29.10.2020 17:01 # 0
guest8 29.10.2020 17:03 # −999
bormand 29.10.2020 17:12 # 0
Ну разве что icu::UnicodeString или QString.
guest8 29.10.2020 17:28 # −999
bormand 29.10.2020 17:34 # 0
guest8 29.10.2020 17:41 # −999
gost 29.10.2020 19:30 # 0
bormand 29.10.2020 19:34 # 0
Ну и правильно. Это же байт, а не число.
guest8 29.10.2020 19:37 # −999
bormand 29.10.2020 16:51 # 0
Fike 29.10.2020 15:45 # 0
bormand 29.10.2020 15:47 # 0
defecate-plusplus 29.10.2020 15:47 # 0
Fike 29.10.2020 15:49 # 0
A string begins and ends with
quotation marks. All Unicode characters may be placed within the
quotation marks, except for the characters that MUST be escaped:
quotation mark, reverse solidus, and the control characters (U+0000
through U+001F).
но в то же время
When all the strings represented in a JSON text are composed entirely
of Unicode characters [UNICODE] (however escaped), then that JSON
text is interoperable in the sense that all software implementations
that parse it will agree on the contents of names and of string
values in objects and arrays.
https://tools.ietf.org/html/rfc8259#section-7
bormand 29.10.2020 15:55 # +1
Fike 29.10.2020 15:56 # 0
bormand 29.10.2020 16:02 # 0
Fike 29.10.2020 16:12 # 0
guest8 29.10.2020 16:08 # −999