使用多行导入JSON数据并转换为R中的数据框

时间:2013-07-29 16:39:25

标签: regex json r rjsonio rjson

假设我有以下JSON数据:

{ "_id" : { "$oid" : "string" }, "titulo" : "string", "id_cv" : 1132, "textos" : [ { "fecha" : { "$date" : 1217376000000 }, "estado" : "string", "texto" : "string", "source_url" : "string" } ] }
{ "_id" : { "$oid" : "string" }, "titulo" : "string", "autores" : ",\"string\",\"string\",\"string\",\"string",5", "id_cv" : 1138, "textos" : [ { "fecha" : { "$date" : 1217548800000 }, "estado" : "string", "texto" : "string", "source_url" : "string" } ] }

我正在尝试将JSON数据导入R并将其转换为最终的R数据帧。

假设我在R中有以下脚本:

library("rjson")
json_file <- "/Users/usr/file/json_data.json"
json_data <- fromJSON(paste(readLines(json_file), collapse=""))

data = unlist(json_data)

title=data[names(data)=="titulo"]
print(title)

text=data[names(data)=="textos.texto"]
print(text)

url=data[names(data)=="textos.source_url"]
print(url)

当我运行此脚本时,JSON数据仅生成包含JSON数据文件第一行的数据框。我有大约200行。我所知道的一个问题是JavaScript不允许“允许”多行字符串。我试图以各种方式解决这个问题:

  1. 在每行'数据'之间添加'“'。
  2. 在数据的每一行'末尾添加'“'。
  3. 在每行“数据”之间添加“\”。
  4. 将“\”添加到每个“行”数据的末尾。
  5. 将所有多行转换为一行(将“\ n”替换为“\ n”)
  6. 使用正则表达式尝试了上述所有内容。

    我的问题是:如何操作JSON数据,以便将数据的所有“行”读入R中,以便我可以将它们取消列表并使用等于“title”的列构造相应的数据框, 'text','url'和行等于JSON数据中的'lines'?

    我使用RJSON&amp; amp; R中的RJSONIO库,但我对我目前使用哪一个库感到矛盾,因为我最终认为问题在于JSON数据本身的格式化

2 个答案:

答案 0 :(得分:2)

JSON字符串本身确实不太正确。

  1. 其中一个字符串中缺少\,因此未正确屏蔽一个引号:"autores" : ",\"string\",\"string\",\"string\",\"string",5"应为"autores" : ",\"string\",\"string\",\"string\",\"string\",5"
  2. 单个{}个对象(第1行和第2行,如您所说)必须合并为一个上层结构,一个数组([])或一个对象({},标识符)因为否则没有明确定义,如何解释JSON结构。
  3. 我将您的JSON字符串修改为由两个数组元素组成,每个元素包含一行(=一个JSON对象):

    [{ "_id" : { "$oid" : "string" },
         "titulo" : "string",
         "id_cv"  : 1132, 
         "textos" : [ { "fecha" : { "$date" : 1217376000000 }, 
                                   "estado" : "string", 
                                   "texto"  : "string",
                               "source_url" : "string" } ] },
    
     { "_id" : { "$oid" : "string" },
         "titulo" : "string", 
         "autores" : ",\"string\",\"string\",\"string\",\"string\",5",
         "id_cv" : 1138,
         "textos" : [ { "fecha" : { "$date" : 1217548800000 },
                                   "estado" : "string",
                                    "texto" : "string", 
                               "source_url" : "string" } ] }]
    

    我添加了换行符以提高可读性。换行符和空格(在单个标识符或字符串之外)是 - 或更好:应该 - 被JSON解析器忽略。

答案 1 :(得分:0)

这里我已经将JSON字符串解析为数据框。我认为这对你有用。

http://spring-webservice-2-step-by-step.blogspot.in/2013/10/voltdb-with-r-real-time-analysis.html