Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/magento/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在javascript和JSON中将字符串解析为对象时遇到问题_Javascript_Json_Parsing_Cassandra - Fatal编程技术网

在javascript和JSON中将字符串解析为对象时遇到问题

在javascript和JSON中将字符串解析为对象时遇到问题,javascript,json,parsing,cassandra,Javascript,Json,Parsing,Cassandra,我正在查询Cassandra数据库,然后尝试将其中一个BLOB条目转换为javascript对象。 目前有一行获取我感兴趣的数据/blob: data[x][0] 当我使用console.log时: console.log("data[x][0]: ", data[x][0]); 输出为: data[x][0]: <Buffer 7b 22 70 72 65 66 69 78 22 3a 20 22 65 6e 77 69 6b 69 22 2c 20 22 74 69 74 6c

我正在查询Cassandra数据库,然后尝试将其中一个BLOB条目转换为javascript对象。

目前有一行获取我感兴趣的数据/blob:

data[x][0]
当我使用console.log时:

console.log("data[x][0]: ", data[x][0]);
输出为:

data[x][0]:  <Buffer 7b 22 70 72 65 66 69 78 22 3a 20 22 65 6e 77 69 6b 69 22 2c 20 22 74 69 74 6c 65 22 3a 20 22 22 41 67 68 6e 61 64 61 72 72 61 67 68 22 22 7d>
以下是输出:

data[x][0].toString():  {"prefix": "enwiki", "title": ""Aghnadarragh""}
看起来很完美!这就是我试图创建的对象!(虽然现在是一个字符串)

那么…为什么不用JSON解析dam呢?看起来像是JSON

console.log( "JSON.string(data[x][0]): ", JSON.parse( data[x][0].toString() ) );
如果这样做,JSON库就会抛出一个错误:

events.js:72
        throw er; // Unhandled 'error' event
              ^
SyntaxError: Unexpected token A
    at Object.parse (native)
    at CassandraBackend.queryCB2 (/home/brandomiranda/Documents/6.S194/testreduce/CassandraBackend.js:831:70)
    at Object.callback (/home/brandomiranda/Documents/6.S194/testreduce/node_modules/node-cassandra-cql/index.js:248:16)
    at Connection.handleFrame (/home/brandomiranda/Documents/6.S194/testreduce/node_modules/node-cassandra-cql/lib/connection.js:244:15)
    at FrameParser.<anonymous> (/home/brandomiranda/Documents/6.S194/testreduce/node_modules/node-cassandra-cql/lib/connection.js:45:12)
    at FrameParser.EventEmitter.emit (events.js:92:17)
    at emitReadable_ (_stream_readable.js:408:10)
    at emitReadable (_stream_readable.js:404:5)
    at readableAddChunk (_stream_readable.js:165:9)
    at FrameParser.Readable.push (_stream_readable.js:127:10)
不会产生有用的信息:

object
如何将该字符串转换为Javascript对象?


注意:此项目使用的是Cassandra 2.0.5

这来自一个开源项目,生成此代码的确切行可以在以下位置找到:

更仔细地研究一下整个开放源码,我们可以确认,
数据[x][0]
确实直接来自Cassandra,而且是一个blob

data[x]
索引Cassandra查询的特定行<代码>数据[x][0]为列编制索引。在顶部,我们可以看到从数据库中提取的行是通过查询指定的:

query: 'select test, score from test_by_score where commit = ?'
因此,索引0从
表test\u by\u score
中获取列“test”。我们可以通过以下方式确认其为blob:

    CREATE TABLE IF NOT EXISTS test_by_score (
        commit blob, 
        delta int, 
        score int, 
        test blob, 
    PRIMARY KEY(commit, delta, test) );
所以我的推论是,要么Cassandra给出了错误的东西,没有生成正确的JSON对象,要么…最初在测试中插入的东西没有正确地插入为JSON对象…可能是哪一个?让我们探索更多


针对开源回购协议上的此漏洞发布了一个gitissue

作为参考,我还在github上发表了一篇gitissue文章,解释了这个问题以及为解决这个问题所做的事情(以及为解决这个bug而进行的任何讨论)


gitissue还为人们提供了一个参考,让他们了解原始回购协议如何解决该问题。

我认为问题在于框架:因为它似乎使用双引号符号将值插入Cassandra。在JSON中,首选单引号符号

处理这个问题有两种方法:要么对即将到来的更新使用单引号(旧数据必须被截断,因为它不可读)或者您可以通过一种解决方法来解决这个问题:“Aadit M Shah”中删除内部双引号的注释可能会起作用,但您的应用程序可能需要它们。因此,我认为这个问题需要一些更复杂的RegExp,因为您只希望替换内部双引号

JSON.parse(data[x][0].toString().replace(/\"\"\(.*)\"\"/g, /\"\'$1\'\"/)
可以解决这个问题

也考虑将BLUB更改为VARCHAR,如这里所讨论的:


您的JSON无效。
“title”:“Aghnadarragh”
周围的引号太多。
Aghnadarragh
前面的
关闭字符串。这就是为什么您会得到
意外标记A
。如果需要引号,则需要对其进行转义。
“title”:“Aghnadarragh”"
如果这确实是Cassandra为您生成的json,那么我强烈建议您向Cassandra团队提交一份错误报告。它不应该生成无效的json。好吧,这段代码的美妙之处在于它是一个开源项目。我相信它确实来自Cassandra,但我还不确定是否会责怪Cassandra。Loo如果您感兴趣,请使用
JSON.parse(data[x][0].toString().replace(/\“\”/g,”))我并不真的认为我的解决方案是一个答案。在我看来,这是一个相当脆弱的黑客攻击,这就是为什么我把它作为一个评论来代替。StAcExover的伟大之处在于你可以回答你自己的问题并接受它,我鼓励你这么做。如果你找到了一个更好的解决问题的方法,那么你就应该定义。请将其作为答案发布。如果没有,请随意将我的答案作为您自己的答案发布。声誉对我来说并没有什么影响。但是,如果其他人遇到您的问题,您的答案对他有帮助,那么这将是值得的。无论如何,请享受编码乐趣。=)您是如何从您的答案中推断出以下几行的:我认为问题出在框架中:因为它似乎使用双引号符号将值插入Cassandra。"? 您是在Cassandra 2.0.5中试用过它,还是阅读过一些文档?据我所知,框架在单引号合适的地方使用了双引号表示法。因此,通过这句话,我想在不改变框架的情况下提出一个解决方案。我阅读了第830()行的代码。
    CREATE TABLE IF NOT EXISTS test_by_score (
        commit blob, 
        delta int, 
        score int, 
        test blob, 
    PRIMARY KEY(commit, delta, test) );
JSON.parse(data[x][0].toString().replace(/\"\"\(.*)\"\"/g, /\"\'$1\'\"/)