2017-01-23 157 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