2011-06-19 68 views
5

tôi nhận được một lỗi Assertion: 10340:Failure parsing JSON string, chạy mongoimport trong ống trên Github API, như sau:Không phân tích cú pháp JSON với mongoimport

[email protected]:~/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" 
... 
... 

xem toàn bộ dấu vết ở đây: http://pastie.org/2093486. Dù sao, định dạng json tôi nhận lại từ API Github có vẻ ok (cuộn tròn 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" 
}, 
... 
... 
] 

ở đây nó là một đoạn: http://www.pastie.org/2093524.

Nếu tôi cố gắng xác định định dạng csv nó hoạt động:

[email protected]:~/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 
[email protected]:~/rails/github/gitwatcher$ 
+0

Không sử dụng dịch vụ dễ bay hơi như pastebin để tham chiếu mã/dữ liệu từ các bài đăng SO. –

+0

... dễ bay hơi? ... pastebin? Các liên kết mã trước không phải là pastebin cũng không dễ bay hơi ;-) Cảm ơn bạn đã downvoting! –

+0

Tôi có thể sao chép điều này trên 1.8.1 64b. Nhìn vào những gì có thể xảy ra. Tôi đã dán đầu ra trong trình xác nhận JSON và JSON hợp lệ. – lobster1234

Trả lời

2

Được rồi đây là những gì có thể xảy ra. Trước hết, tôi đã xóa tất cả các dòng mới trong JSON để giảm số lỗi từ n (trong đó n = số dòng) thành 1. Sau đó, nó quay ra, tôi phải bọc JSON Array trong một biến khác và nó hoạt động sau đó. Tôi nghĩ rằng mongoimport được thiết kế để hoạt động với mongoexport, vì vậy rất có thể bạn không thể sử dụng nó để nhập bất kỳ JSON tùy ý nào. Tuy nhiên, nếu bạn muốn, những gì tôi đã làm woud là một cái gì đó bạn phải làm trong mã trước khi gọi tiện ích nhập khẩu.

Tôi chỉ sử dụng 1 bản ghi trong khi tôi đang thử nghiệm. Đây là bản ghi không có dòng mới.

[{"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!"}] 

Sau đó, tôi quấn nó với somedata (bạn có thể sử dụng bất kỳ tên ở đây):

{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!"}]} 

Và tôi đã có thể nhìn thấy những kỷ lục trong 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!" 
     } 
    ] 
} 

Hy vọng điều này sẽ hữu ích!

+1

Điều đó thực sự tuyệt vời. Khắc phục sự cố tuyệt vời tại đây! Cảm ơn nhiều. –

25

Nó làm việc cho tôi bằng cách sử dụng "mongoimport --jsonArray ..."

+0

Cảm ơn! Sau khi đập đầu tôi trong một giờ tại sao nó nói rằng JSON của tôi không hợp lệ. – occasl

+1

có hoạt động thực sự tốt, ngay cả với các ký tự dòng mới ở đó. –

+0

... đó là tuyệt vời –

1

này làm việc tốt với tôi sau khi tôi loại bỏ bất kỳ '\ n'. Bạn có thể sử dụng tr trong linux cat file.json | tr -d '\ n'> file.json

1

Sử dụng cả hai câu trả lời được cung cấp bởi @Daniel và @ lobster1234 Tôi đã tạo một tập lệnh mà tôi sử dụng để nhập các mục nhập json vào 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 
Các vấn đề liên quan