gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:32:48 25 4
gpt4 key购买 nike

我正在查询 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>

所以我总结了它的一些十六进制缓冲区对象(我以前见过),所以我尝试用 toString() 方法将它变成一个字符串,然后也许我们可以解析它并将它变成一个 javascript目的!

首先,我测试了 toString() 方法:

console.log("data[x][0].toString(): ", data[x][0].toString());

输出如下:

data[x][0].toString():  {"prefix": "enwiki", "title": ""Aghnadarragh""}

看起来很完美!那就是我要创建的对象! (虽然现在是一个字符串)

那么...为什么不使用 JSON 解析大坝呢?看起来像 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)

根据错误消息,我猜想我给它的字符串形成了一些无法正确解析的标记(我猜可能是因为它不遵守 JSON 语法)。

但是,如果它不是 JSON,那么它是什么?也很难知道它来自什么语法,因为我真的不知道原始事物是什么类型的对象:

正在做:

console.log(typeof data[x][0]);

不产生有用的信息:

object

如何将该字符串变成 Javascript 对象?


注意:这个项目使用的是 Cassandra 2.0.5

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

https://github.com/gwicke/testreduce/blob/master/CassandraBackend.js#L830

仔细查看整个开源,我们可以确认 data[x][0] 确实直接来自 Cassandra,并且是一个 blob。

data[x] 索引 Cassandra 查询的特定行。 data[x][0] 索引该列。在顶部我们可以看到它从数据库中获取的行是由查询指定的:

query: 'select test, score from test_by_score where commit = ?'

因此,索引 0 从 table test_by_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,解释了这个问题以及为解决它所做的事情(以及恰好解决这个错误的任何讨论。

https://github.com/gwicke/testreduce/issues/43

gitissue 还为人们提供了一个引用,让人们了解原始 repo 上的问题是如何解决的。

最佳答案

我认为问题出在框架中:因为它似乎使用双引号表示法将值插入 Cassandra。在 JSON 中,首选的是单引号。

你有两种方法来处理这个问题:要么你对即将到来的更新插入使用单引号(旧数据必须被 chop ,因为它不可读)或者你用变通方法解决这个问题:来自“Aadit M Shah”的评论删除内部双引号可能会起作用——但也许您的应用程序需要它们。所以我认为这个问题需要一些更复杂的 RegExp,因为您只想替换内部双引号。

JSON.parse(data[x][0].toString().replace(/\"\"\(.*)\"\"/g, /\"\'$1\'\"/)

可能会解决问题。

还可以考虑将 BLOB 更改为 VARCHAR,如下所述: Thinking of storing serialized java objects into cassandra as JSON. What is the catch?

关于javascript - 在将字符串解析为 javascript 和 JSON 中的对象时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23440489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com