关于带有 couchDB 视图的“无效 JSON”的错误,但 json 很好

Posted

技术标签:

【中文标题】关于带有 couchDB 视图的“无效 JSON”的错误,但 json 很好【英文标题】:Error about 'invalid JSON' with couchDB view but the json's fine 【发布时间】:2010-03-17 11:30:47 【问题描述】:

我正在尝试在 CouchDB 上设置以下视图


"_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"
        
    

当我尝试使用 curl 'PUT' 时:

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

我知道它不是无效的 JSON,因为我使用 Python 2.6 中内置的“json”库对其进行了测试,它可以正常加载。 JS 搞砸了给我错误“必须评估一个函数”

我用 od 检查了文件,没有隐藏的控制字符,我的系统设置为 UTF-8。我正在使用 CouchDB 0.10.1 版

还有什么问题?

【问题讨论】:

keys.json 是否可以使用 UTF-16 或 UCS-2 等 16 位编码进行编码? 仅供参考,您的 JSON 在 Chrome、Internet Explorer 和 Firefox 中解析得很好。 @Joachim_Sauer 文件keys.json,显示为'ascii text',如果用'od -c'检查没有恐怖控制字符,我的系统默认为utf-8,我很困惑 curl -v 有帮助,因为它会转储发送到服务器的实际请求 【参考方案1】:

@titanoba 暗示了这个问题:

-d option of curl 期望实际数据作为参数!

如果要在文件中提供数据,则需要在其前面加上@

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

【讨论】:

我知道我只是忘记了。 拍脑袋 +1:那些不断给予和给予(并节省我时间)的答案之一。谢谢。【参考方案2】:

可能需要将您的 JSON 放在单引号中:

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

对我有用,但是

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

抛出你提到的错误。我猜当你省略单引号时,shell 会以某种方式干扰你发送的数据。

编辑:我正在使用 bash。

【讨论】:

【参考方案3】:

您最近是否从源代码更新了 CouchDB?如果是这样,请务必删除所有旧文件。

【讨论】:

【参考方案4】:

原因

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

行不通的是引号是由shell使用单引号对引号进行插值的。

【讨论】:

以上是关于关于带有 couchDB 视图的“无效 JSON”的错误,但 json 很好的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 为 couchDB 创建视图

CouchDb - 防止 couchDb 提供视图

从 couchdb 视图访问会话信息

couchdb:更新带有附件的文档上的元数据?

Couchdb 视图,查找条件

CouchDB:视图中的过滤函数