如何将含转义Unicode序列的文件导入MongoDB?
问题描述
我在R语言中处理包含Unicode修饰字符的数据框:
d <- data.frame(id = 1, norm = "m͐pinĭ̍s̓u")
需要将该数据框导入MongoDB(使用Compass),让Unicode字符正确显示,但尝试多种方法均失败:
- 保存为制表符分隔文本:MongoDB直接将Unicode列视为普通字符串,不解析显示修饰字符。
- 用
jsonlite转JSON导出:
导出的JSON会给Unicode转义序列添加额外反斜杠,变成library(jsonlite) j <- toJSON(d, dataframe="rows", pretty=T) write(j, "jstest.json")m\\u0350pini\\u0306\\u030Ds\\u0313u,MongoDB无法识别,仍显示转义字符串。 - 用
mongoimport导入JSON数组:
先执行R代码:
再执行导入命令:d <- data.frame(id=c(1,2),unicode=c("m͐pini̍s̓1u","a͐mpi̍η")) js <- toJSON(d, dataframe = "rows", pretty = T) write(js, "jstest.json")
导入后MongoDB文档仍显示转义串:mongoimport -d test -c newcoll --type json --file jstest.json --jsonArray
只有手动插入带单个反斜杠的文档才能正常显示Unicode符号,但批量处理上千条数据无法手动操作。{ "_id" : ObjectId("666b08603505c9daeb20edc7"), "id" : 1, "unicode" : "m\u0350pini\u030Ds\u03131u" } { "_id" : ObjectId("666b08603505c9daeb20edc8"), "id" : 2, "unicode" : "a\u0350mpi\u030D\u03B7" }
解决方法
问题核心是jsonlite默认会将Unicode字符转义为\uXXXX格式,且写入文件时会再次转义反斜杠,导致MongoDB读取的是转义后的字符串而非原始Unicode字符。可通过以下步骤解决:
1. 导出JSON时保留原始Unicode字符
修改toJSON参数,禁用Unicode转义,并使用writeLines避免额外转义:
library(jsonlite) d <- data.frame(id=c(1,2),unicode=c("m͐pini̍s̓1u","a͐mpi̍η")) # 禁用Unicode转义,直接输出原始字符;auto_unbox简化JSON结构 js <- toJSON(d, dataframe = "rows", pretty = T, auto_unbox = T, unicode = FALSE) # writeLines不会额外转义反斜杠,直接写入原始JSON内容 writeLines(js, "jstest.json")
关键参数说明:
unicode = FALSE:让jsonlite直接保留原始Unicode字符,不转义为\uXXXX序列。writeLines:替代write,避免写入时自动添加额外反斜杠。
2. 执行mongoimport导入
运行原导入命令即可:
mongoimport -d test -c newcoll --type json --file jstest.json --jsonArray
3. 验证结果
导入后在MongoDB Compass中查看文档,Unicode修饰字符会正常显示:
{ "_id" : ObjectId("xxxxxx"), "id" : 1, "unicode" : "m͐pini̍s̓1u" } { "_id" : ObjectId("xxxxxx"), "id" : 2, "unicode" : "a͐mpi̍η" }
内容的提问来源于stack exchange,提问作者eazyezy
相关产品推荐
相关产品推荐

