| 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; } [Ссылки] |