code: public SerIterator createChild(Object value, SerIterator parent) {
          Class<?> declaredType = parent.valueType();
          List<Class<?>> childGenericTypes = parent.valueTypeTypes();
          if (value instanceof Collection) {
              if (childGenericTypes.size() == 1) {
                  return collection((Collection<?>) value, declaredType, childGenericTypes.get(0), EMPTY_VALUE_TYPES);
              }
              return collection((Collection<?>) value, Object.class, Object.class, EMPTY_VALUE_TYPES);
          }
          if (value instanceof Map) {
              if (childGenericTypes.size() == 2) {
                  return map((Map<?, ?>) value, declaredType, childGenericTypes.get(0), childGenericTypes.get(1), EMPTY_VALUE_TYPES);
              }
              return map((Map<?, ?>) value, Object.class, Object.class, Object.class, EMPTY_VALUE_TYPES);
          }
          if (value.getClass().isArray() && value.getClass().getComponentType().isPrimitive() == false) {
              Object[] array = (Object[]) value;
              return array(array, Object.class, value.getClass().getComponentType());
          }
          return null;
      }
docs: Creates an iterator wrapper for a value retrieved from a parent iterator.
  <p>
  Allows the parent iterator to define the child iterator using generic type information.
  This handles cases such as a {@code List} as the value in a {@code Map}.
  
  @param value  the possible collection-like object, not null
  @param parent  the parent iterator, not null
  @return the iterator, null if not a collection-like type