Разбор массива JSON из ответа curl в Tizen Native
Так что я новичок в Tizen Native Development и мне нужна помощь в разборе массива JSON из завитка ответа. Я смог опубликовать данные с помощью curl и получить ответ, используя этот фрагмент:
static size_t WriteMemoryCallback(void *contents, size_t size, size_t nmemb, void *userp){
size_t realsize = size * nmemb;
struct MemoryStruct *mem = (struct MemoryStruct *)userp;
mem->memory = realloc(mem->memory, mem->size + realsize + 1);
if(mem->memory == NULL) {
/* out of memory! */
dlog_print(DLOG_DEBUG, TAG, "not enough memory (realloc returned NULL)\n");
return 0;
}
memcpy(&(mem->memory[mem->size]), contents, realsize);
mem->size += realsize;
mem->memory[mem->size] = 0;
dlog_print(DLOG_DEBUG, TAG, contents);
return realsize;
}
Журнал будет печатать:
["423866","423865","423864","423862","423861","423856","423855","423851","423846","423844"]
Тем не менее, я не могу понять, как разобрать содержимое. Я прочитал много тем об использовании Json-glib, но не совсем понимаю, как его использовать. Кто-нибудь может помочь?
Обновление: так я публикую данные, используя curl.
/* get a curl handle */
curl = curl_easy_init();
if(curl) {
dlog_print(DLOG_DEBUG, TAG, "curl init");
dlog_print(DLOG_DEBUG, TAG, "curl url: %s", url);
/* Set CURL parameters */
/* First set the URL that is about to receive our POST. This URL can
just as well be a https:// URL if that is what should receive the
data. */
curl_easy_setopt(curl, CURLOPT_URL, url);
/* send all data to this function */
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
/* Now specify the POST data */
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "w=4");
/* we pass our 'chunk' struct to the callback function */
curl_easy_setopt(curl, CURLOPT_WRITEDATA, (void *)&chunk);
/* some servers don't like requests that are made without a user-agent
field, so we provide one */
curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl-agent/1.0");
/* Perform the request, res will get the return code */
res = curl_easy_perform(curl);
/* Check for errors */
if(res != CURLE_OK)
dlog_print(DLOG_DEBUG, TAG, "curl_easy_perform() Failed: %s\n",curl_easy_strerror(res));
else{
dlog_print(DLOG_DEBUG, TAG, "curl_easy_perform() Success");
dlog_print(DLOG_DEBUG, TAG, "curl_code: %d", res);
dlog_print(DLOG_DEBUG, TAG, "%d bytes retrieved\n", (long)chunk.size);
}
/* always cleanup */
curl_easy_cleanup(curl);
}
else{
dlog_print(DLOG_DEBUG, TAG, "curl failed");
}
Теперь я смог преобразовать содержимое в char:
char* test;
test = (char*) contents;
dlog_print(DLOG_DEBUG, TAG, "test value: %s", test);
Тем не менее, я думаю, что это стало как строка. Я хочу преобразовать его в массив и получить значения для каждого индекса.
2 ответа
Вам нужен JSON-GLIB.
добавлять
#include <json-glib.h>
Следующим шагом является создание экземпляра парсера следующим образом:
JsonParser *jsonParser = NULL;
GError *error = NULL;
jsonParser = json_parser_new ();
ParseJsonEntity()
в примере кода есть основной цикл для выполнения анализа JSON. Поскольку JSON имеет данные трех типов, такие как Object, Array, Value, основной цикл намеренно обнаруживает их и анализирует их содержимое.
Если текущий узел имеет тип 'object' или 'array', он продолжает анализировать дерево JSON ParseJsonEntity()
рекурсивно. но в случае типа "значение", он извлекает значения ExtractValue()
,
Следуйте этому руководству для более подробной информации. Пример приложения также приведен там.
Вы можете использовать это две библиотеки:
- restclient-cpp: https://github.com/mrtazz/restclient-cpp -
- rapidjson: http://rapidjson.org/md_doc_tutorial.html
Первый - это обертка для завитков. Он дает вам методы GET, POST и т. Д. Простым способом.
Второй упрощает разбор json.
Это библиотеки C++, поэтому вы можете написать свои методы для доступа к API в файле.cpp и экспортировать их в C с ключевым словом extern.