Как напечатать первые десять строк файла JSON в R

У меня есть R dataframe и преобразовал его в формат json с помощью пакета jsonlite

jsonData <- toJSON(dataset)

Я хочу проверить, если преобразование прошло успешно, набор данных очень большой. Как мне распечатать первые 5 строк в файле json?

1 ответ

Решение

Преобразование объектов R в JSON

Есть несколько пакетов, которые реализуют toJSON() функция, например, jsonlite, rjson, а также RJSONIO, я использую jsonlite В следующих. Решение также работает с RJSONIO, но не с rjson,

Я не нашел прямой способ напечатать только подмножество строк из строки JSON. Причина в том, что все три пакета возвращают один символ (т. Е. Символьный вектор длины один), а не символьный вектор, где каждая строка строки JSON занимает один элемент:

length(jsonlite::toJSON(mtcars))

Действительно, преобразованный объект представляет собой одну длинную строку текста:

jsonlite::toJSON(mtcars)
## [{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.62,"qsec":16.46,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4"},{"mpg":21,"cyl":6,"disp":160,"hp":110,"drat":3.9,"wt":2.875,"qsec":17.02,"vs":0,"am":1,"gear":4,"carb":4,"_row":"Mazda RX4 Wag"},{"mpg":22.8,"cyl":4,"disp":108,"hp":93,"drat":3.85,"wt":2.32,"qsec":18.61,"vs":1,"am":1,"gear":4,"carb":1,"_row":"Datsun 710"},{"mpg":21.4,"cyl":6,"disp":258,"hp":110,"drat":3.08,"wt":3.215,"qsec":19.44,"vs":1,"am":0,"gear":3,"carb":1,"_row":"Hornet 4 Drive"},{"mpg":18.7,"cyl":8,"disp":360,"hp":175,"drat":3.15,"wt":3.44,"qsec":17.02,"vs":0,"am":0,"gear":3,"carb":2,"_row":"Hornet Sportabout"},{"mpg":18.1,"cyl":6,"disp":225,"hp":105,"drat":2.76,"wt":3.46,"qsec":20.22,"vs":1,"am":0,"gear":3,"carb":1,"_row":"Valiant"},{"mpg":14.3,"cyl":8,"disp":360,"hp":245,"drat":3.21,"wt":3.57,"qsec":15.84,"vs":0,"am":0,"gear":3,"carb":4,"_row":"Duster 360"},{"mpg":24.4,"cyl":4,"disp":146.7,"hp":62,"drat":3.69,"wt":3.19,"qsec":20,"vs":1,"am":0,"gear":4,"c... <truncated>

Поскольку есть только одна строка, вы, очевидно, ничего не получите, печатая только первые несколько строк.

Но функция toJSON от jsonlite (и тот из RJSONIO) позволяет разбить строку JSON на строки (я обрезал вывод вручную, потому что он слишком длинный):

jsonlite::toJSON(mtcars, pretty = TRUE)
## [
##   {
##     "mpg": 21,
##     "cyl": 6,
##     "disp": 160,
##     "hp": 110,
##     "drat": 3.9,
##     "wt": 2.62,
## ...

Это по-прежнему символьный вектор длины один, но теперь строки разделены переносами строк (\n), которая может быть использована для достижения вашей цели:

length(jsonlite::toJSON(mtcars, pretty = TRUE))
## [1] 1
as.character(jsonlite::toJSON(mtcars, pretty = TRUE))
## [1] "[\n  {\n    \"mpg\": 21,\n    \"cyl\": 6,\n    \"disp\": 160,\n    \"hp\": 110,\n    \"drat\": 3.9,\n    \"wt\": 2.62,\n    \"qsec\": 16.46,\n    \"vs\": 0,\n    \"am\": 1,\n    \"gear\": 4,\n    \"carb\": 4,\n    \"_row\": \"Mazda RX4\"\n  },\n  {\n    \"mpg\": 21,\n    \"cyl\": 6,\n    \"disp\": 160,\n    \"hp\": 110,\n    \"drat\": 3.9,\n    \"wt\": 2.875,\n    \"qsec\": 17.02,\n    \"vs\": 0,\n    \"am\": 1,\n    \"gear\": 4,\n    \"carb\": 4,\n    \"_row\": \"Mazda RX4 Wag\"\n  },\n  {\n    \"mpg\": 22.8,\n    \"cyl\": 4,\n    \"disp\": 108,\n    \"hp\": 93,\n    \"drat\": 3.85,\n    \"wt\": 2.32,\n    \"qsec\": 18.61,\n    \"vs\": 1,\n    \"am\": 1,\n    \"gear\": 4,\n    \"carb\": 1,\n    \"_row\": \"Datsun 710\"\n  },\n  {\n    \"mpg\": 21.4,\n    \"cyl\": 6,\n    \"disp\": 258,\n    \"hp\": 110,\n    \"drat\": 3.08,\n    \"wt\": 3.215,\n    \"qsec\": 19.44,\n    \"vs\": 1,\n    \"am\": 0,\n    \"gear\": 3,\n    \"carb\": 1,\n    \"_row\": \"Hornet 4 Drive\"\n  },\n  {\n  ... <truncated>

Печать только подмножества строк из JSON

Я написал небольшую функцию, которая принимает объект JSON в качестве входных данных и печатает подмножество его строк. Это работает только если вы используете pretty = TRUE при создании объекта JSON. Вот:

print_json_lines <- function(json, lines) {

  # break up into lines
  json_lines <- strsplit(json, "\n")[[1]]

  # get desired lines
  json_lines <- json_lines[lines]

  # print
  cat(paste(json_lines, collapse = "\n"))

  # return invisily
  invisible(json_lines)

}

Оно использует strsplit() разбить строку на вектор символов, по одной записи на строку. Тогда можно выбрать строки обычным индексированием с помощью [], Поскольку простая печать символьного вектора, скорее всего, напечатает несколько строк символов в одной строке, я снова объединю подмножество строк в одну строку (с paste()) и разделить строки \n, Это приводит к красиво отформатированному выводу:

print_json_lines(jsonlite::toJSON(mtcars, pretty = TRUE), 1:5)
## [
##   {
##     "mpg": 21,
##     "cyl": 6,
##     "disp": 160,

Замечание о разных пакетах JSON

Как я уже упоминал в начале, это решение работает для обоих, jsonlite а также RJSONIO, Причина в том, что они оба позволяют разбить строку JSON на строки с pretty = TRUE, Тем не менее, вывод выглядит иначе, когда вы используете RJSONIO, потому что он использует разные соглашения в преобразовании:

print_json_lines(RJSONIO::toJSON(mtcars, pretty = TRUE), 1:5)
## {
##     "mpg" : [
##             21,
##             21,
##             22.8,

Функция не работает с rjsonпотому что я не знаю, как разделить объект JSON на строки.

Другие вопросы по тегам