json_tokener_parse()
возвращает первый JSON объект, который он находит в предоставленном буфере. Когда вы вызываете его, вы помещаете его в переменную с именем parsed_json
.
Так как во второй раз вы пытаетесь получить имя, которое вы продолжаете передавать parsed_json
,
json_object_object_get_ex(parsed_json, "name", &name);
printf("name 2 : %s\n", json_object_get_string(name));
с тем же именем
Что вам нужно сделать, это продолжить анализ по номеру json_tokener_parse_ex
. Согласно документации , его интерфейс имеет вид
JSON_EXPORT struct json_object* json_tokener_parse_ex(
struct json_tokener * tok,
const char * str,
int len
)
, где
Параметры
tok json_tokener, ранее выделенный с json_tokener_new()
str строкой с любым допустимым выражением JSON или частью. Это не должно заканчиваться нулем.
len длина строки
Это в основном будет анализировать входной буфер как json_tokener_parse()
, но используя внутренне токен сможет предупредить вас, когда нужно проанализировать что-то еще. Это делается путем возврата json_tokener_continue
.
Пожалуйста, обратитесь к документации для получения дополнительной информации. Я просто привожу здесь пример, показанный по приведенной выше ссылке на документацию:
json_object *jobj = NULL;
const char *mystring = NULL;
int stringlen = 0;
enum json_tokener_error jerr;
do
{
mystring = ... // get JSON string, e.g. read from file, etc...
stringlen = strlen(mystring);
jobj = json_tokener_parse_ex(tok, mystring, stringlen);
} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);
if (jerr != json_tokener_success)
{
fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));
// Handle errors, as appropriate for your application.
}
if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
{
// Handle extra characters after parsed object as desired.
// e.g. issue an error, parse another object from that point, etc...
}
// Success, use jobj here.
Альтернативное решение
Что касается других вопросов, я подтверждаю, что сначала или позже у вас будет проблемы с вашим буфером, если количество JSON объектов продолжает увеличиваться. Решение этой проблемы приводит к альтернативному решению.
Конечно, вы можете читать их один за другим, но вам придется выполнять синтаксический анализ самостоятельно при чтении из файла. Но если вы уверены, что файловая структура будет всегда той, которую вы разместили в своем вопросе, вам повезет: то, что вы можете сделать, это
fopen()
файл, как теперь - Читайте из файла строка за строкой, используя
fgets()
вместо fread()
. Введите данные в buffer
- Проверьте, содержит ли последняя строка закрывающую фигурную скобку
}
. Если да, go на - Теперь
buffer
содержит ровно один объект. Наберите json_tokener_parse()
, как вы делали раньше, и напечатайте данные, проанализированные с помощью json_object_object_get_ex()
- . Повторите до пункта (2) , пока не будет достигнут конец файла
fclose()
файл