R语言中如何将该类JSON结构代码转换为data.frame数据框
报错原因
触发解析错误的核心原因是page_2存储的是JavaScript对象字面量格式文本,并非标准JSON:按照JSON规范,所有对象的键名(即当前文本中的position/type/codEsta/monEsta/htmlPag字段)必须使用双引号包裹,而当前文本里的键名直接裸露书写,jsonlite::fromJSON()在读取到无引号的position键起始位置时,就会抛出非法字符的词法解析错误。
处理步骤
通过正则补全键名双引号,把类JSON修正为标准格式后再解析,最后拆分嵌套的经纬度字段,即可得到规整的data.frame对象,代码如下:
# 1. 文本预处理:给所有裸键名补上双引号,转为标准JSON standard_json <- page_2 %>% str_replace_all("(?<=[{,])\\s*([a-zA-Z0-9_]+)\\s*:", ' "\\1":') # 若文本中存在单引号包裹的字符串值,可取消下一行注释统一替换为双引号 # str_replace_all("'", '"') # 2. 解析标准JSON raw_parsed <- jsonlite::fromJSON(standard_json, flatten = TRUE) # 3. 展平嵌套结构,生成规整数据框 station_df <- as_tibble(raw_parsed) %>% dplyr::mutate( lon = purrr::map_dbl(position, ~.x[1]), lat = purrr::map_dbl(position, ~.x[2]) ) %>% # 不需要保留原始嵌套坐标列可执行下行 dplyr::select(-position)
逻辑说明
- 正则匹配规则为定位
{或,后紧跟的、冒号前的合法字段名,这类位置的字符一定是JSON键,包裹双引号后完全符合JSON规范,不会再触发解析错误 - 解析时添加
flatten = TRUE参数可自动打平嵌套结构,减少后续列表处理成本 position字段解析后默认是列表列(每个元素是长度为2的经纬度数值向量),用purrr::map_dbl分别提取经度、纬度生成独立列后,就是标准的二维data.frame结构,7条站点记录可全部正常读入。
内容的提问来源于stack exchange,提问作者Alvaro Morales
相关产品推荐
相关产品推荐

