【问题标题】:How to read a newline delimited JSON file from R?如何从 R 中读取换行符分隔的 JSON 文件?
【发布时间】:2020-01-26 19:29:14
【问题描述】:

我有一个换行符分隔(即每个 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)

【问题讨论】:

  • 你能显示d的输出吗
  • 试试read_jsonstream_in
  • 我无法显示d,因为fromJSON 失败并出现以下错误:Error: lexical error: invalid char in json text. testfile.json (right here) ------^
  • 我会和read_json一起阅读,看看它是否有效 (d &lt;- read_json('testfile.json')
  • 我有一个换行符分隔(即每个 JSON 对象被限制在文件中的 1 行) 为什么?你有什么办法改变吗?

标签: python r jsonlite


【解决方案1】:

我们可以从jsonlite使用stream_in

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"

【讨论】:

  • 嗨@akrun:stream_in() 适用于未装箱的json。有没有办法让它在盒装单行 json 上工作?
  • @LazarusThurston 能否请您发布一个新问题
  • 当然。将其作为一个新问题提出。
  • 它现在正在工作:P。将暂时推迟发布问题。
【解决方案2】:

您可以将数据读取并处理为适当的格式,然后解析 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 包主要用于列表

或者另一个)

【讨论】:

    【解决方案3】:

    读取换行 json 的最快方法可能是 stream_in from ndjson。它使用底层的C++ 库(尽管我认为它仍然是单线程的)。尽管如此,我发现它比(仍然非常好)jsonlite 库快得多。作为奖励,json 默认是展平的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-02-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多