2016-01-19 2 views
-1

Как пропустить вложенный объект cJSON? Я хочу получить (распечатать) все ключи и значения из родительского объекта deviceData в C. Свой объект cJson.итерация вложенного объекта cJSON в c

obj =  {  "command": "REPLACE_ROWS", 
      "table": "Device.XXX", 
      "deviceData": { 
        "device0": { 
         "DeviceName": "Filtered Device", 
         "MACAddress": "112233445599" 
        }, 
        "device1": { 
         "DeviceName": "Filtered Device", 
         "MACAddress": "112233445599" 
        }, 
        "device2": { 
         "DeviceName": "Filtered Device", 
         "MACAddress": "112233445599" 
        } 
      } 
    }; 

как печатать ключи deviceData (например device0 device1 устройство 2 и так далее) в С. Заранее спасибо.

+1

Что вы пробовали? Какие проблемы у вас есть с вашим кодом? Как это работает или не работает? Не могли бы вы попытаться создать [Минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve) и показать нам? И если вы еще не сделали этого yeyt, пожалуйста, [прочитайте о том, как задавать хорошие вопросы] (http://stackoverflow.com/help/how-to-ask). –

+0

@Jochimpileborg: Спасибо за ваш комментарий. В следующий раз опубликуйте четкие вопросы. – selvam

ответ

3

Предположив obj представляет собой строку, содержащую ваш объект, вы разбираете его затем использовать next итерировать:

cJSON * root = cJSON_Parse(obj); 
cJSON * deviceData = cJSON_GetObjectItem(root,"deviceData"); 
if(deviceData) { 
    cJSON *device = deviceData->child; 
    while(device) { 
     // get and print key 
     device = device->next; 
    } 
} 
+0

Спасибо, что это сработало. In while loop i напечатал ключ, используя printf («Key is% s», device-> string); – selvam

1

Там же комментарий в документации cJSON о итерация объекта:

итерировать над объектом вы можете использовать макрос cJSON_ArrayForEach так же, как и для массивов.

См: https://github.com/DaveGamble/cJSON#objects

cJSON_ArrayForEach макрос в основном делает то же самое предложение Ilya, но он избегает опираясь на cJSON детали реализации.

+1

О детали реализации: Я пытаюсь не нарушать API и ABI, это означает, что это будет работать для версий 1.x.x неограниченно без 'cJSON_ArrayForEach'. Структура cJSON в v2 изменится точно, но 'next' и' child', вероятно, останутся прежними. (Я поддерживаю cJSON). – FSMaxB

Смежные вопросы