(

  (defun search_list_then_resume (key json_object result)
    (if result
        result
        (search_for_value_given_key key (r json_object))
    )
  )

  (defun search_for_value_given_key (key json_object)
    (if json_object
        (if (l (f from_json_dict))  ; if we are hitting an unlabelled item (atom), just move on
            (if (= (f (f json_object)) key)  ; if we have found our key
                (r (f json_object))  ; return the value
                (if (l (r (f json_object)))  ; otherwise check if we have hit another dictionary
                    (search_list_then_resume key json_object (search_for_value_given_key key (r (f json_object))))  ; check new dictionary
                    (search_for_value_given_key key (r json_object))
                )
            )
            (search_for_value_given_key key (r json_object))
        )
        ()
    )
  )
)
