【发布时间】:2015-04-22 17:06:13
【问题描述】:
我正在编写一个简单的 perl 脚本来从文件中读取 JSON 并将其插入 MongoDB。但我面临 json 解码的问题。
我的原始 json 中的所有非字符串值都在 decode_json 之后转换为对象类型。
输入 JSON(只有一部分,因为它是原始的,很大) -
{
"_id": 2006010100000801089,
"show_image" : false,
"event" : "publish",
"publish_date" :1136091600,
"data_version" : 1
}
插入到 MongoDB 的 JSON -
{
"_id": NumberLong("2006010100000801089"),
"show_image" : BinData(0,"MA=="),
"event" : "publish",
"publish_date" :NumberLong(1136091600),
"data_version" : NumberLong(1)
}
我正在为文档提供自定义 _id,我希望将其转换为 NumberLong 类型。正如您从上面的 JSON 中看到的那样,它按预期工作。但请注意 show_image、publish_date 和 data_version 的其他非字符串值是如何转换为它的对象表示的。
有什么办法可以保留这些值的原始类型?
执行插入的 Perl 代码剪辑器 -
use MongoDB;
use MongoDB::OID;
use JSON;
use JSON::XS
while(my $record = <$source_file>) {
my $record_decoded = decode_json($record);
$db_collection->insert($record_decoded);
}
使用的 Perl 版本为 v5.18.2。
我查找了JSON::XS docs,但找不到执行此操作的方法。任何帮助表示赞赏。提前致谢!
我对 perl 很陌生。对不起,如果这是一个微不足道的问题。
【问题讨论】:
-
关于“插入 MongoDB 的 JSON”,这不是 JSON。
-
Re“有什么办法可以保留这些值的原始类型吗?”,我不确定你在问什么。我认为您想更改插入数据库的内容。如果是这样,您究竟想为您的示例插入什么?
-
例如参考我的示例 JSON,我希望将
show_image的值插入为false而不是BinData(0,"MA==")和publish_date插入为1136091600而不是NumberLong(1136091600)。 -
感谢@ikegami 解决我的问题。如果我不解码 JSON,我会收到异常
not a reference at /Library/Perl/5.18/darwin-thread-multi-2level/MongoDB/Collection.pm line 235 -
那么那个方法就不能用来插入JSON了。为什么你说你想要 JSON?或者为什么将 JSON 传递给不接受 JSON 的方法?你没有道理。