2010-03-17 36 views
9

Tôi cố gắng để thiết lập các điểm sau trên CouchDBLỗi về 'không hợp lệ JSON' với CouchDB xem nhưng của json tốt

{ 
"_id":"_design/id", 
"_rev":"1-9be2e55e05ac368da3047841f301203d", 
"language":"javascript", 
    "views":{ "by_id":{ 
       "map" : "function(doc) { emit(doc.id, doc)}" 
     },"from_user_id":{ 
      "map" : "function(doc) { if (doc.from_user_id) {emit(doc.from_user_id, doc)}}"}, 
     "from_user":{ 
      "map" : "function(doc) { if (doc.from_user) {emit(doc.from_user, doc)}}"}, 
     "to_user_id":{ 
      "map" : "function(doc) {if (doc.to_user_id){ emit(doc.to_user_id, doc)}}"}, 
     "to_user":{ 
      "map" : "function(doc) {if (doc.to_user){ emit(doc.to_user, doc)}}" }, 
     "max_id":{ 
     "map" : "function(doc) { if (doc.id) {emit(doc._id, eval(doc.id))}}", 
     "reduce" :"function(key,value) { a = value[0]; for (i=1; i <value.length; ++i){a = Math.max(a,value[i])} return a}" 
     } 
    } 
} 

khi tôi cố gắng 'PUT' này sử dụng curl:

curl -X PUT -d keys.json $CDB/_design/id 
{"error":"bad_request","reason":"invalid UTF-8 JSON"} 

Tôi biết nó không phải là JSON không hợp lệ, bởi vì tôi đã thử nghiệm nó bằng cách sử dụng thư viện 'json' được xây dựng trong Python 2.6, nó tải tốt. JS vít ups cung cấp cho tôi lỗi 'phải đánh giá một chức năng'

Tôi đã kiểm tra tệp với od, không có ký tự điều khiển ẩn, hệ thống của tôi được đặt thành UTF-8. Tôi đang sử dụng phiên bản CouchDB 0.10.1

Điều gì khác có thể xảy ra với nó?

+0

Có thể là keys.json được mã hóa bằng mã hóa 16 bit như UTF-16 hoặc UCS-2 không? –

+0

Là một FYI, JSON của bạn phân tích tốt trong Chrome, Internet Explorer và Firefox. –

+0

@Joachim_Sauer tệp keys.json, hiển thị nó dưới dạng 'văn bản ascii', Nếu được chọn với 'od -c' không có ký tự kiểm soát kinh dị, hệ thống của tôi mặc định là utf-8, tôi bị bối rối –

Trả lời

18

@titanoba ám chỉ vấn đề:

Các -d option of curl hy vọng dữ liệu thực tế như là đối số!

Nếu bạn muốn cung cấp các dữ liệu trong một tập tin, bạn cần phải thêm tiền tố nó với @:

curl -X PUT -d @keys.json $CDB/_design/id 
+0

Tôi biết điều này tôi chỉ quên. * tát đầu * –

+0

Cảm ơn sự giúp đỡ –

+0

+1: Một trong những câu trả lời đó tiếp tục cho và tặng (và tiết kiệm thời gian cho tôi) Cảm ơn. –

4

Nó có thể là cần thiết để đưa JSON của bạn vào dấu nháy đơn:

curl -vX PUT http://localhost:5984/dbname/docid -d '{"foo" : "bar"}' 

công trình đối với tôi nhưng

curl -vX PUT http://localhost:5984/dbname/docid -d {"foo" : "bar"} 

ném lỗi mà bạn đề cập đến. Tôi đoán vỏ bằng cách nào đó can thiệp vào dữ liệu bạn gửi khi bạn bỏ qua các dấu nháy đơn.

chỉnh sửa: Tôi đang sử dụng bash.

2

Bạn có cập nhật CouchDB từ nguồn thời gian gần đây? Nếu vậy, hãy chắc chắn xóa tất cả các tệp cũ.

0

Lý do

curl -vX PUT http://localhost:5984/dbname/docid -d {"foo" : "bar"} 

Không làm việc là có dấu ngoặc kép được nội suy bằng vỏ bằng cách sử dụng dấu nháy đơn thoát dấu ngoặc kép.

Các vấn đề liên quan