使用mongoimport解析JSON失败

时间:2011-06-19 23:35:28

标签: json mongodb api nosql

我收到Assertion: 10340:Failure parsing JSON string错误,通过Github API在管道中运行mongoimport,如下所示:

lsoave@ubuntu:~/rails/github/gitwatcher$ curl https://api.github.com/users/lgs/repos | mongoimport -h localhost -d gitwatch_dev -c repo -f repositories
connected to: localhost
 % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                Dload  Upload   Total   Spent    Left  Speed
 0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0Mon Jun 20 00:56:01 Assertion: 10340:Failure parsing JSON string near: [
100 22303  100 22303    0     0  31104      0 --:--:-- --:--:-- --:--:--  111k
0x816d8a1 0x8118814 0x84b357a 0x84b5bb8 0x84adc65 0x84b2ee1 0x60bbd6 0x80f5bc1
mongoimport(_ZN5mongo11msgassertedEiPKc+0x221) [0x816d8a1]
mongoimport(_ZN5mongo8fromjsonEPKcPi+0x3b4) [0x8118814]
mongoimport(_ZN6Import9parseLineEPc+0x7a) [0x84b357a]
mongoimport(_ZN6Import3runEv+0x1a98) [0x84b5bb8]
mongoimport(_ZN5mongo4Tool4mainEiPPc+0x1ce5) [0x84adc65]
mongoimport(main+0x51) [0x84b2ee1]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x60bbd6]
mongoimport(__gxx_personality_v0+0x3f1) [0x80f5bc1]
exception:Failure parsing JSON string near: [
[
...
...
Mon Jun 20 00:45:20 Assertion: 10340:Failure parsing JSON string near: "name": "t
0x816d8a1 0x8118814 0x84b357a 0x84b5bb8 0x84adc65 0x84b2ee1 0x126bd6 0x80f5bc1
mongoimport(_ZN5mongo11msgassertedEiPKc+0x221) [0x816d8a1]
mongoimport(_ZN5mongo8fromjsonEPKcPi+0x3b4) [0x8118814]
mongoimport(_ZN6Import9parseLineEPc+0x7a) [0x84b357a]
mongoimport(_ZN6Import3runEv+0x1a98) [0x84b5bb8]
mongoimport(_ZN5mongo4Tool4mainEiPPc+0x1ce5) [0x84adc65]
mongoimport(main+0x51) [0x84b2ee1]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe6) [0x126bd6]
mongoimport(__gxx_personality_v0+0x3f1) [0x80f5bc1]
exception:Failure parsing JSON string near: "name": "t
"name": "tentacles"
...
...

在此处查看完整跟踪:http://pastie.org/2093486。无论如何,我从Github API返回的json格式似乎没问题(curl https://api.github.com/users/lgs/repos):

[
 {
    "open_issues": 0,
    "watchers": 3,
    "homepage": "http://scrubyt.org",
    "language": null,
    "forks": 1,
    "pushed_at": "2009-02-25T22:49:08Z",
    "created_at": "2009-02-25T22:22:40Z",
    "fork": true,
    "url": "https://api.github.com/repos/lgs/scrubyt",
    "private": false,
    "size": 188,
    "description": "A simple to learn and use, yet powerful web scraping toolkit!",
    "owner": {
     "avatar_url": "https://secure.gravatar.com/avatar/9c7d80ebc20ab8994e51b9f7518909ae?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2
Fgravatar-140.png",
     "login": "lgs",
     "url": "https://api.github.com/users/lgs",
     "id": 1573
    },
    "name": "scrubyt",
    "html_url": "https://github.com/lgs/scrubyt"
 },
...
...
]

这是一个片段:http://www.pastie.org/2093524

如果我尝试指定csv格式,它可以工作:

lsoave@ubuntu:~/rails/github/gitwatcher$ curl https://api.github.com/users/lgs/repos | mongoimport -h localhost -d gitwatch_dev -c repo -f repositories --type csv
connected to: localhost
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 22303  100 22303    0     0  23914      0 --:--:-- --:--:-- --:--:--  106k
imported 640 objects
lsoave@ubuntu:~/rails/github/gitwatcher$ 

4 个答案:

答案 0 :(得分:25)

使用“mongoimport --jsonArray ...

对我有用

答案 1 :(得分:2)

好的,这是可能发生的事情。首先,我删除了JSON中的所有换行符,以减少从n(其中n =行数)到1的错误数。然后事实证明,我必须将JSON数组包装在另一个变量中,然后它才能工作。我认为mongoimport旨在与mongoexport一起使用,因此很可能您无法使用它来导入任意JSON。但是,如果你愿意,在调用导入实用程序之前,我所做的就是你在代码中必须做的事情。

我在测试时只使用了1条记录。这是没有换行的记录。

[{"url":"https://api.github.com/repos/lgs/scrubyt", "pushed_at": "2009-02-25T22:49:08Z","homepage": "http://scrubyt.org",  "forks": 1,"language": null,"fork": true,"html_url": "https://github.com/lgs/scrubyt","created_at": "2009-02-25T22:22:40Z", "open_issues": 0,"private": false,"size": 188,"watchers": 3,"owner": {"url": "https://api.github.com/users/lgs","login": "lgs","id": 1573,"avatar_url": "https://secure.gravatar.com/avatar/9c7d80ebc20ab8994e51b9f7518909ae?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"},"name": "scrubyt","description": "A simple to learn and use, yet powerful web scraping toolkit!"}]

然后我用somedata包裹它(你可以在这里使用任何名字):

{somedata:[{"url":"https://api.github.com/repos/lgs/scrubyt", "pushed_at": "2009-02-25T22:49:08Z","homepage": "http://scrubyt.org",  "forks": 1,"language": null,"fork": true,"html_url": "https://github.com/lgs/scrubyt","created_at": "2009-02-25T22:22:40Z", "open_issues": 0,"private": false,"size": 188,"watchers": 3,"owner": {"url": "https://api.github.com/users/lgs","login": "lgs","id": 1573,"avatar_url": "https://secure.gravatar.com/avatar/9c7d80ebc20ab8994e51b9f7518909ae?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"},"name": "scrubyt","description": "A simple to learn and use, yet powerful web scraping toolkit!"}]}

我能够看到Mongo的记录。

> db.repo.findOne()
{
    "_id" : ObjectId("4dff91d29c73f72483e82ef2"),
    "somedata" : [
        {
            "url" : "https://api.github.com/repos/lgs/scrubyt",
            "pushed_at" : "2009-02-25T22:49:08Z",
            "homepage" : "http://scrubyt.org",
            "forks" : 1,
            "language" : null,
            "fork" : true,
            "html_url" : "https://github.com/lgs/scrubyt",
            "created_at" : "2009-02-25T22:22:40Z",
            "open_issues" : 0,
            "private" : false,
            "size" : 188,
            "watchers" : 3,
            "owner" : {
                "url" : "https://api.github.com/users/lgs",
                "login" : "lgs",
                "id" : 1573,
                "avatar_url" : "https://secure.gravatar.com/avatar/9c7d80ebc20ab8994e51b9f7518909ae?d=https://a248.e.akamai.net/assets.github.com%2Fimages%2Fgravatars%2Fgravatar-140.png"
            },
            "name" : "scrubyt",
            "description" : "A simple to learn and use, yet powerful web scraping toolkit!"
        }
    ]
}

希望这有帮助!

答案 2 :(得分:1)

在删除任何'\ n'后,这对我很好。你可以在linux中使用tr     cat file.json | tr -d'\ n'> file.json

答案 3 :(得分:1)

使用@Daniel和@ lobster1234提供的答案我创建了一个脚本,用于将json条目导入mongo。

#!/bin/sh

if [ -z "$1" ] ;
then
    echo "missing argument"
    exit -1
fi

FILE=${1%%.json}

echo $FILE

cat $FILE.json | tr -d '\n' > $FILE.import.json

mongoimport --collection collection --db main --file $FILE.import.json --jsonArray --upsert