text: 
  #ifndef _json_c_json_visit_h_
  #define _json_c_json_visit_h_
  
  /**
   * @file
   * @brief Methods for walking a tree of objects.
   */
  #include "json_object.h"
  
  #ifdef __cplusplus
  extern "C" {
  #endif
  
  typedef int(json_c_visit_userfunc)(json_object *jso, int flags, json_object *parent_jso,
                                     const char *jso_key, size_t *jso_index, void *userarg);
  
  /**
   * Visit each object in the JSON hierarchy starting at jso.
   * For each object, userfunc is called, passing the object and userarg.
   * If the object has a parent (i.e. anything other than jso itself)
   * its parent will be passed as parent_jso, and either jso_key or jso_index
   * will be set, depending on whether the parent is an object or an array.
   *
   * Nodes will be visited depth first, but containers (arrays and objects)
   * will be visited twice, the second time with JSON_C_VISIT_SECOND set in
   * flags.
   *
   * userfunc must return one of the defined return values, to indicate
   * whether and how to continue visiting nodes, or one of various ways to stop.
   *
   * Returns 0 if nodes were visited successfully, even if some were
   *  intentionally skipped due to what userfunc returned.
   * Returns <0 if an error occurred during iteration, including if
   *  userfunc returned JSON_C_VISIT_RETURN_ERROR.
   */
  JSON_EXPORT int json_c_visit(json_object *jso, int future_flags, json_c_visit_userfunc *userfunc,
                               void *userarg);
  
  /**
   * Passed to json_c_visit_userfunc as one of the flags values to indicate
   * that this is the second time a container (array or object) is being
   * called, after all of it's members have been iterated over.
   */
  #define JSON_C_VISIT_SECOND 0x02
  
  /**
   * This json_c_visit_userfunc return value indicates that iteration
   * should proceed normally.
   */
  #define JSON_C_VISIT_RETURN_CONTINUE 0
  
  /**
   * This json_c_visit_userfunc return value indicates that iteration
   * over the members of the current object should be skipped.
   * If the current object isn't a container (array or object), this
   * is no different than JSON_C_VISIT_RETURN_CONTINUE.
   */
  #define JSON_C_VISIT_RETURN_SKIP 7547
  
  /**
   * This json_c_visit_userfunc return value indicates that iteration
   * of the fields/elements of the <b>containing</b> object should stop
   * and continue "popped up" a level of the object hierarchy.
   * For example, returning this when handling arg will result in
   * arg3 and any other fields being skipped.   The next call to userfunc
   * will be the JSON_C_VISIT_SECOND call on "foo", followed by a userfunc
   * call on "bar".
   * <pre>
   * {
   *   "foo": {
   *     "arg1": 1,
   *     "arg2": 2,
   *     "arg3": 3,
   *     ...
   *   },
   *   "bar": {
   *     ...
   *   }
   * }
   * </pre>
   */
  #define JSON_C_VISIT_RETURN_POP 767
  
  /**
   * This json_c_visit_userfunc return value indicates that iteration
   * should stop immediately, and cause json_c_visit to return success.
   */
  #define JSON_C_VISIT_RETURN_STOP 7867
  
  /**
   * This json_c_visit_userfunc return value indicates that iteration
   * should stop immediately, and cause json_c_visit to return an error.
   */
  #define JSON_C_VISIT_RETURN_ERROR -1
  
  #ifdef __cplusplus
  }
  #endif
  
  #endif /* _json_c_json_visit_h_ */
  