cJSON: как прочитать массив JSON |
![]() |
Добавил(а) microsin |
Предполжим, что у нас есть вот такой текст JSON: { "name": "Мониторы 4K", "resolutions": [ { "width": 1280, "height": 720 }, { "width": 1920, "height": 1080 }, { "width": 3840, "height": 2160 } ] } И нужно обработать по очереди элементы массива с параметрами разрешающей способности мониторов. Общий принцип следующий: 1. С помощью вызова cJSON_Parse из текста создается корневой объект cJSON. 2. С помощью вызова cJSON_GetObjectItem создается новый объект, соответствующий массиву. Для нашего примера в cJSON_GetObjectItem передается корневой объект cJSON и текстовое имя массива "resolutions". 3. С помощью вызова cJSON_GetArraySize, куда передается cJSON массива, вычисляется количество элементов в массиве. Для нашего примера это 3 элемента. 4. Осуществляется цикл по элементам массива с помощью вызовов cJSON_GetArrayItem, куда передается cJSON массива и индекс элемента. Для нашего примера индекс будет от 0 до 2 включительно. Соответствующий код примера обработки массива JSON: bool readingJSON (char *JSONtxt) { bool result = false; cJSON *jroot = NULL; // корневой объект cJSON *jarray = NULL; // объект массива cJSON *jitem = NULL; // объект элемента массива cJSON *jvalue = NULL; // объект значения параметра элемента массива do { // Получение корневого cJSON: jroot = cJSON_Parse(JSONtxt); if (NULL == jroot) break; // Получение объекта cJSON, соответствующий массиву: jarray = cJSON_GetObjectItem(jroot, "resolutions"); if (NULL == jarray) break; // Получение количества элементов в массиве: int numitems = cJSON_GetArraySize(jarray); // Цикл по элементам массива: for (index = 0; index < numitems; index++) { // Извлечение элемента массива: jitem = cJSON_GetArrayItem(jarray, index); if (NULL == jitem) break; // Здесь могут быть какие-нибудь операции // с элементами массива, например: jvalue = cJSON_GetObjectItem(jitem, "width"); if (NULL == jvalue) break; printf("Ширина %d\n", cJSON_GetNumberValue(jvalue)); jvalue = cJSON_GetObjectItem(jitem, "height"); if (NULL == jvalue) break; printf("Высота %d\n", cJSON_GetNumberValue(jvalue)); } result = (index == numitems) ? true : false; }while(false); return result; } [Ссылки] |