2017-01-13 4 views
0

Это тело JSON отвечают:Как проверить значение ребенка в гнездовой JSON

{ 
    "studentName": "good student", 
    "age": "18", 
    "address": "street 123", 
    "courses": { 
    "math": { 
     "description": "how to calculate", 
     "enrollment": "enrolled", 
     "status": { 
     "result": "OK" 
     } 
    }, 
    "english": { 
     "description": "abc", 
     "enrollment": "not-enrolled", 
     "status": { 
     "result": "OK" 
     } 
    } 
    } 
} 

Я хотел бы проверить «регистрации» значение, например, я хочу, чтобы получить выход в следующем формате:

math : enrolled 
english : not-enrolled 

интересно, как это сделать с помощью команды jq, заранее.

+0

Не уверен, что ваш запрос – newGuy

+0

@newGuy, Например, команда jq 'jq '.courses'' даст результат:' { "math": { "описание": "как рассчитать", "регистрация": "зарегистрировано" , "статус": { "результат": "ОК" } }, "английский": { "Описание": "а", "прием": "не зачисленный", "статус": { "результат" : "OK" } } } 'Я пытаюсь получить статус математики регистрации и статус регистрации на английском языке в формате 'math: зарегистрировано english: not-enrolled' – apple

+0

Я считаю, что @Jeff имеет правильную идею – newGuy

ответ

1

Не уверен, что вы подразумеваете под "validate." Но чтобы просто получить "course" и его текущий "enrollment" статус, вы можете сделать это:

.courses | to_entries[] | "\(.key) : \(.value.enrollment)" 
0

Если «проверки» означает проверку того, что значения все, как и ожидалось, то вы можете использовать фильтр по этим линиям:

.courses 
| with_entries(select(.value.enrollment as $e 
       | ["enrolled", "not-enrolled"] | index($e) | not)) 

То есть, выберите курсы, для которых «регистрация» НЕ находится в списке допустимых значений. (Здесь, «X | не» имеет эффект отрицая X.)

Бег это против ваших данных, дополненных курс, для которого «зачисление» неверен дает, что курс:

{ 
    "french": { 
    "description": "abc", 
    "enrollment": "non", 
    "status": { 
     "result": "OK" 
    } 
    } 
} 
+0

Спасибо @peak, это именно то, что я имел в виду. – apple

+0

@apple - Вы можете проголосовать более одного ответа. – peak