setMethod("asJSON", "list", function(x, collapse = TRUE, na = NULL, oldna = NULL,
  is_df = FALSE, auto_unbox = FALSE, indent = NA_integer_, no_dots = FALSE, ...) {

  # reset na arg when called from data frame
  if(identical(na, "NA")){
    na <- oldna;
  }

  # coerse pairlist if needed
  if (is.pairlist(x)) {
    x <- as.vector(x, mode = "list")
  }

  # empty vector
  #if (!length(x)) {
  #  if(collapse) {
  #    return(if (is.null(names(x))) "[]" else "{}")
  #  } else {
  #    return(character())
  #  }
  #}

  # this condition appears when a dataframe contains a column with lists we need to
  # do this, because the [ operator always returns a list of length 1
  # if (length(x) == 1 && is.null(names(x)) && collapse == FALSE) {
  #   return(asJSON(x[[1]], ...))
  # }

  # note we are NOT passing on the container argument.
  tmp <- if(is_df && auto_unbox){
    vapply(x, function(y, ...) {
      asJSON(y, auto_unbox = is.list(y), ...)
    }, character(1), na = na, indent = indent + 2L, no_dots = no_dots, ...)
  } else {
    vapply(x, asJSON, character(1), na = na, auto_unbox = auto_unbox, indent = indent + 2L, no_dots = no_dots, ...)
  }

  if (!is.null(names(x))) {
    if(!collapse){
      #this should never happen
      warning("collapse=FALSE called for named list.")
    }
    #in case of named list:
    objnames <- deparse_vector(cleannames(names(x), no_dots = no_dots))
    collapse_object(objnames, tmp, indent)
  } else {
    #in case of unnamed list:
    if(collapse){
      collapse(tmp, inner = FALSE, indent)
    } else {
      tmp
    }
  }
})
