【问题标题】:How to parse Json in R corresponding to ID如何解析R中对应ID的Json
【发布时间】:2018-10-18 07:59:01
【问题描述】:

我在下面提到了数据框:

ID         Json_Data
PA-124     Json String
PA-145     Json String
PA-185     Json String
PA-149     Json String

我想提取下面提到的每个ID对应的所有json字段。

我想知道如何针对每个特定的ID(即国家/地区)提取一些特定字段。

ID        Name       Country      Code
PA-124    Ajre       Dubai        154
PA-145    Aret       USA          485
PA-185    Cret       Russia       445
PA-149    Oerp       Canada       789

为此,我使用了下面提到的代码,但它仅针对 ~1500 个 ID 中的一个 ID 返回值。

我的代码:

    library(RJSONIO)
    library(rjson)
    library(jsonlite)
    library(data.table)


    f <- function(json, id){
      tmp    <- jsonlite::fromJSON(json)
      tmp    <- as.data.frame(tmp)
      tmp$id <- id
      return(tmp)
    }

json_dfs <- 
  mapply(f, Df$Json_Data, Df$ID, SIMPLIFY = FALSE)

输入:

    structure(list(ID = c("PA-124", "PA-124", "PA-124"), Json_Data = c("{\n  \"hed\": {\n    \"srti\": \"RT1455\"\n  },\n  \"nnaesr\": {\n    \"name\": \"\",\n    \"firt\": \"alex\",\n    \"last\": \"john\",\n    \"birth\": \"26061981\",\n    \"gender\": \"Male\"\n  },\n  \"iteret\": {\n    \"adre\": \"asded14eer\",\n    \"adfe\": \"\",\n    \"sfdet\": \"\",\n    \"sfeet\": \"\",\n    \"serted\": \"\",\n    \"sertgf\": \"\"\n  },\n  \"sefetgd\": {\n    \"mobe\": \"2111111\",\n    \"dfete\": \"\",\n    \"tfet\": \"sdfet\"\n  },\n  \"aarfgeette\": {\n    \"aarfgertte\": \"H NO. , dffr rtrg\",\n    \"aarfgot2\": \"ids School, feeeete,\",\n    \"aarfgot3\": \"\",\n    \"aarfgot4\": \"\",\n    \"aarfgot5\": \"\",\n    \"sdfffy\": \"errtyy\",\n    \"errrte\": \"efeteet\",\n    \"sdetVb\": \"\",\n    \"sdfes\": \"5500\",\n    \"aarfgppr\": \"eretft er\",\n    \"seferf\": \"ered\"\n  }\n}", 
"{\n  \"hed\": {\n    \"srti\": \"RT1455\"\n  },\n  \"nnaesr\": {\n    \"name\": \"\",\n    \"firt\": \"alex\",\n    \"last\": \"john\",\n    \"birth\": \"26061981\",\n    \"gender\": \"Male\"\n  },\n  \"iteret\": {\n    \"adre\": \"asded14eer\",\n    \"adfe\": \"\",\n    \"sfdet\": \"\",\n    \"sfeet\": \"\",\n    \"serted\": \"\",\n    \"sertgf\": \"\"\n  },\n  \"sefetgd\": {\n    \"mobe\": \"2111111\",\n    \"dfete\": \"\",\n    \"tfet\": \"sdfet\"\n  },\n  \"aarfgeette\": {\n    \"aarfgertte\": \"efeet efet\",\n    \"aarfgot2\": \"affe fe,\",\n    \"aarfgot3\": \"\",\n    \"aarfgot4\": \"\",\n    \"aarfgot5\": \"\",\n    \"sdfffy\": \"Telangana\",\n    \"errrte\": \"Hyderabad\",\n    \"sdetVb\": \"\",\n    \"sdfes\": \"5500\",\n    \"aarfgppr\": \"acefec ee\",\n    \"seferf\": \"dfefe\"\n  }\n}", 
"{\n  \"hed\": {\n    \"srti\": \"RT1455\"\n  },\n  \"nnaesr\": {\n    \"name\": \"\",\n    \"firt\": \"alex\",\n    \"last\": \"john\",\n    \"birth\": \"26061981\",\n    \"gender\": \"Male\"\n  },\n  \"iteret\": {\n    \"adre\": \"asded14eer\",\n    \"adfe\": \"\",\n    \"sfdet\": \"\",\n    \"sfeet\": \"\",\n    \"serted\": \"\",\n    \"sertgf\": \"\"\n  },\n  \"sefetgd\": {\n    \"mobe\": \"2111111\",\n    \"dfete\": \"\",\n    \"tfet\": \"sdfet\"\n  },\n  \"aarfgeette\": {\n    \"aarfgertte\": \"ad.de 25dfege\",\n    \"aarfgot2\": \"adfed ,\",\n    \"aarfgot3\": \"\",\n    \"aarfgot4\": \"\",\n    \"aarfgot5\": \"\",\n    \"sdfffy\": \"adffe\",\n    \"errrte\": \"Hyderabad\",\n    \"sdetVb\": \"\",\n    \"sdfes\": \"5500\",\n    \"aarfgppr\": \"sadfe ad\",\n    \"seferf\": \"dsfde\"\n  }\n}"
)), row.names = c(NA, 3L), class = "data.frame")

【问题讨论】:

  • 请使您的示例可重现。你能发布前几行的dput 吗? "Json string" 会很有用。
  • @Axeman 谢谢 用 json 字符串更新了问题。
  • 其实我们更喜欢Dfdput,而不仅仅是json字符串列。你也可以在问题中添加dput(head(Df,3) 吗?
  • @Shique 我已经用 dput 更新了问题。
  • 如果 dput(head(Df,3)) 只返回那个,那么这意味着有问题的 Df 只包含 1 行,导致你得到什么(只有一个 ID)。您需要将所有 ID 及其 json 数据放入 Df

标签: r json dataframe jsonlite


【解决方案1】:

您可以使用unlist 将其转换为字符向量,然后将字符向量列表行绑定到data.frame。然后用你的ID列绑定结果

cbind(temp$ID,
    do.call(rbind, lapply(temp$Json_Data, function(x) unlist(jsonlite::fromJSON(x))))
)

结果:

              hed.srti nnaesr.name nnaesr.firt nnaesr.last nnaesr.birth nnaesr.gender iteret.adre  iteret.adfe iteret.sfdet iteret.sfeet iteret.serted iteret.sertgf
[1,] "PA-124" "RT1455" ""          "alex"      "john"      "26061981"   "Male"        "asded14eer" ""          ""           ""           ""            ""           
[2,] "PA-124" "RT1455" ""          "alex"      "john"      "26061981"   "Male"        "asded14eer" ""          ""           ""           ""            ""           
[3,] "PA-124" "RT1455" ""          "alex"      "john"      "26061981"   "Male"        "asded14eer" ""          ""           ""           ""            ""           
     sefetgd.mobe sefetgd.dfete sefetgd.tfet aarfgeette.aarfgertte aarfgeette.aarfgot2    aarfgeette.aarfgot3 aarfgeette.aarfgot4 aarfgeette.aarfgot5 aarfgeette.sdfffy
[1,] "2111111"    ""            "sdfet"      "H NO. , dffr rtrg"   "ids School, feeeete," ""                  ""                  ""                  "errtyy"         
[2,] "2111111"    ""            "sdfet"      "efeet efet"          "affe fe,"             ""                  ""                  ""                  "Telangana"      
[3,] "2111111"    ""            "sdfet"      "ad.de 25dfege"       "adfed ,"              ""                  ""                  ""                  "adffe"          
     aarfgeette.errrte aarfgeette.sdetVb aarfgeette.sdfes aarfgeette.aarfgppr aarfgeette.seferf
[1,] "efeteet"         ""                "5500"           "eretft er"         "ered"           
[2,] "Hyderabad"       ""                "5500"           "acefec ee"         "dfefe"          
[3,] "Hyderabad"       ""                "5500"           "sadfe ad"          "dsfde"     

【讨论】:

  • 收到此错误:Error: lexical error: invalid char in json text. NA (right here) ------^ Called from: parse_string(txt, bigint_as_char)
  • 你的数据中存在格式错误的json,请一一尝试找出有问题的json。例如,for(x in temp$Json_data) {print(x);来自JSON(x)}
  • 是的,我有一个很大的 Dataframe,一个一个地检查会很费时间……难道我们没有其他选择可以从 Dataframe 中找到这种格式错误的 Json 并将其删除吗??
  • 是的,我在评论中添加了它
  • 仍然无法解析...:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-28
  • 2017-09-24
  • 2012-03-27
  • 2013-08-27
相关资源
最近更新 更多