在R中解析嵌套的Json文件

时间:2017-01-23 10:31:57

标签: json r nested

我需要在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 个答案:

答案 0 :(得分: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

因此,对于data.frame的每一行重复complemento.valorTotal。有关详细信息,请查看?tidyr::unnest