如何从 R 中读取换行符分隔的 JSON 文件?

How to read a newline delimited JSON file from R?

我用换行符分隔(即,每个 JSON 对象在文件中被限制为 1 行):

{"name": "json1"}
{"name": "json2"}
{"name": "json3"}

在Python中我可以很容易的读取如下(我必须使用编码encoding='cp850'来读取我的真实数据):

import json

objs = []
with open("testfile.json", encoding='cp850') as f:
    for line in f:
        objs.append(json.loads(line))

如何在 R 中实现类似的技巧?

最后我想得到一个data.frame:

library("jsonlite")
library("data.table")

d <- fromJSON("testfile.json", flatten=FALSE)
df <- as.data.frame(d)

您可以读取数据并将其处理为正确的格式,然后解析 JSON

jsonlite::fromJSON(sprintf('[%s]', paste(readLines('text.json', warn = FALSE), 
                                         collapse = ',')))

#    name
# 1 json1
# 2 json2
# 3 json3

(您可以使用 许多 替代方案之一作为 JSON 包,例如

  • jsonlite 一个更像 R 的包,因为它主要与数据帧一起工作
  • RJSONIO 一个更 Python-ic 的包,主要用于列表

或另一个)

我们可以使用 stream_in 来自 jsonlite

library(jsonlite)
out <- stream_in(file('testfile.json'))
out
#    name
#1 json1
#2 json2
#3 json3

str(out)
#'data.frame':  3 obs. of  1 variable:
#$ name: chr  "json1" "json2" "json3"

读取换行符 json 的最快方法可能是 stream_in 来自 ndjson。它使用底层 C++ 库(尽管我认为它仍然是单线程的)。不过,我发现它比(仍然非常好的)jsonlite 库快得多。作为奖励,json 默认情况下是扁平化的。

library(ndjson)
out<- ndjson::stream_in(path='./testfile.json')