2017-01-23 153 views
2

我需要中的R,以打开和解析以下嵌套JSON文件解析中的R嵌套JSON文件

[ 
{ 
    "complemento": { 
    "valorTotal": 24.9 
    }, 
    "dets": [ 
    { 
     "nItem": "1", 
     "prod": { 
     "indTot": "1", 
     "qCom": 1.0, 
     "uCom": "UN", 
     "vProd": 3.5, 
     "vUnCom": 3.5, 
     "xProd": "AGUA" 
     } 
    }, 
    { 
     "nItem": "2", 
     "prod": { 
     "indTot": "1", 
     "qCom": 0.312, 
     "uCom": "KG", 
     "vProd": 21.4, 
     "vUnCom": 68.6, 
     "xProd": "BUFFET" 
     } 
    } 
    ], 
    "emit": { 
    "cnpj": "01.234.567/0001-89", 
    "enderEmit": { 
     "fone": "1-650-933-4902", 
     "xBairro": "", 
     "xLgr": "650 Castro St. unit 210", 
     "xMun": "Mountain View", 
     "xPais": "United States", 
     "uf": "CA" 
    }, 
    "xFant": "TOTVS Labs" 
    }, 
    "ide": { 
    "dhEmi": { 
     "$date": "2016-01-05T12:01:54.000Z" 
    }, 
    "natOp": "VENDA" 
    }, 
    "infAdic": { 
    "infCpl": "Mesa 2" 
    }, 
    "total": { 
    "icmsTot": { 
     "vDesc": 0.0, 
     "vFrete": 0.0, 
     "vOutro": 0.0, 
     "vProd": 24.9, 
     "vSeg": 0.0, 
     "vTotTrib": 2.53, 
     "vbc": 0.0, 
     "vbcst": 0.0, 
     "vcofins": 0.0, 
     "vicms": 0.0, 
     "vicmsDeson": 0.0, 
     "vii": 0.0, 
     "vipi": 0.0, 
     "vnf": 24.9, 
     "vpis": 0.0, 
     "vst": 0.0 
    } 
    }, 
    "versaoDocumento": 1.0 
} 
,{ 
    "complemento": { 
    "valorTotal": 92.53 
    }, 
    "dets": [ 
    { 
     "nItem": "1", 
     "prod": { 
     "indTot": "1", 
     "qCom": 1.218, 
     "uCom": "KG", 
     "vProd": 83.55, 
     "vUnCom": 68.6, 
     "xProd": "BUFFET" 
     } 
    }, 
    { 
     "nItem": "2", 
     "prod": { 
     "indTot": "1", 
     "qCom": 2.0, 
     "uCom": "UN", 
     "vProd": 9.0, 
     "vUnCom": 4.5, 
     "xProd": "REFRIGERANTE" 
     } 
    } 
    ], 

我可以通过使用fromJSON命令

Data <- fromJSON("sample.txt") 

然而打开它,所述dets列打开后它是一个列表,我不能正确地取消它,因为项目是不同的。

enter image description here

json.matchData <- fromJSON("sample.txt") 
head(json.matchData) 
matchData.i <- lapply(json.matchData$dets, function(x){unlist(x)}) 
matchData <- rbind.fill(lapply(matchData.i, 
          function(x) do.call("data.frame", as.list(x)) 
          )) 
matchData <- do.call("rbind", matchData.i) 
matchData <- as.data.frame(matchData) 

即未上市dets柱的结果。我想知道是否可以从加载的数据中提取值nItemvProdxProd

enter image description here

回答

1

你可以做的是:

require(jsonlite) 
require(tidyr) # or require(tidyverse) 
dat <- fromJSON("sample.json", flatten = TRUE) # flatten = TRUE flattens dets 
dat <- dat[, c("complemento.valorTotal", "dets")] # just for simplification 
unnest(dat, dets) 

它给你:

complemento.valorTotal nItem prod.indTot prod.qCom prod.uCom prod.vProd prod.vUnCom prod.xProd 
1     24.90  1   1  1.000  UN  3.50   3.5   AGUA 
2     24.90  2   1  0.312  KG  21.40  68.6  BUFFET 
3     92.53  1   1  1.218  KG  83.55  68.6  BUFFET 
4     92.53  2   1  2.000  UN  9.00   4.5 REFRIGERANTE 

所以complemento.valorTotal重复在限定词的data.frame的每一行。看看?tidyr::unnest的细节

+0

谢谢@ Floo0,我可以用你的代码解决这个问题。最后一个问题是代码中的数据格式:''$ date“:”2016-01-05T12:01:54.000Z“'我能够使用as.Date()提取日期,但不是时间。再次感谢你,我很抱歉,如果我打扰你,社区的愚蠢和天真的问题 –

+0

看起来像'?as.POSIXct' – Rentrop