【问题标题】:Javascript JSON.parse() error while trying to parse stringified quill.js quill [closed]尝试解析字符串化的 quill.js quill 时出现 Javascript JSON.parse() 错误 [关闭]
【发布时间】:2020-10-06 22:20:24
【问题描述】:

我正在尝试使用 ejs 向客户端发送一些对象。 至少到目前为止,我这样做时没有遇到任何问题。 我这样存放羽毛笔

{"form_type":"blog","form_sub_type":"create","blog_title":"Test","quill_0":"{\"ops\":[{\"insert\":\"tesarfd\\n\"}]}"}

当我尝试先将它们发送给客户端时,我会运行此函数以从文件中获取对象

const fileToJson = async (filePath) => {
    return new Promise(resolve => {
        fs.readFile(filePath, 'utf-8', (err, data) => {
            if (err) {
                console.log(err);
                resolve(false);
            }
            resolve(data);//returns json string 
        })
    })
}

在客户端, 我尝试使用以下内容:

'<%-JSON.stringify(blog)%>'
'<%-blog%>'

当我记录第二个时,我只得到 [Object object] 并且无法访问它的字段。 当我登录我得到的第一个时:

{"edit":true,"editable":true,"blog_id":3,"blog":{"form_type":"blog","form_sub_type":"create","blog_title":"Test","quill_0":"{"ops":[{"insert":"tesarfd\n"}]}"}}

无法解析。

产生错误的代码:

 const blog_info = '<%-JSON.stringify(blog)%>';
    console.log(JSON.parse(blog_info));

错误:

Uncaught SyntaxError: Unexpected token f in JSON at position 51
    at JSON.parse (<anonymous>)
    at blog_panel?id=6:335

编辑2: 来自源代码的行与另一个产生相同错误的字符串

const blog_content=JSON.parse('{"edit":true,"editable":true,"blog_id":7,"blog":"{\"form_type\":\"blog\",\"form_sub_type\":\"create\",\"blog_title\":\"Test\",\"quill_0\":\"\\\"<p>Test</p>\\\"\"}"}');

JSON.parse() 抛出:

Uncaught SyntaxError: Unexpected token o in JSON at position 3
    at JSON.parse (<anonymous>)
    at blog_panel?id=6:335

【问题讨论】:

  • 我觉得这个问题有点令人困惑。问题的标题是 "JSON.parse() error" 所以我认为它是关于 resolve(JSON.parse(data.toString())); 行但是你没有提供错误是什么。您能否将您遇到的错误添加到问题中?
  • @3limin4t0r 相应编辑
  • 我只得到了[Object object],对吗?你期待它做什么? JSON.Parse 返回一个对象?!如果你想要一个字符串。不要解析它。
  • 我正在尝试解析作为字符串传递给客户端的嵌套 json 对象
  • 你快到了。查看您的“edit2”,您需要摆脱 JSON.parse(...) 调用和周围的单引号。输出应该是const blog_content = {"edit":true, ...}

标签: javascript json ejs quill


【解决方案1】:

data.toString() 将返回"[Object object]",所以这就是您从resolve 中得到的全部内容。你应该在那里打电话给stringify,这可能会有所帮助。

【讨论】:

  • 仍然无法解析将 data.toString() 更改为 JSON.stringify(data) 导致的以下字符串:{"edit":true,"editable":true,"blog_id":6,"blog":"{"form_type":"blog","form_sub_type":"create","blog_title":"fdsafasdf","quill_0":"{\"ops\":[{\"insert\":\"fsdafsda\\n\"}]}"}"}
  • 这不是有效的 JSON。把它放到 jsonlint.com 中,你会看到有一组额外的引号把它弄乱了。在这种情况下,您正在寻找的另一个答案是您正在寻找的字符串:)
  • 谢谢,看来我搞砸了
【解决方案2】:

问题:

const blog_info = '<%-JSON.stringify(blog)%>';
console.log(JSON.parse(blog_info));

&lt;%-JSON.stringify(blog)%&gt; 是否放置在字符串上下文中(在这种情况下为单引号)。让我举一个例子来说明这个问题。

// example #1
// assumption
<% blog = {title: "Let's play Tic-Tac-Toe"} %>

// Then this will result in:
const blog_info = '<%-JSON.stringify(blog)%>';
const blog_info = '{"title":"Let's play Tic-Tac-Toe"}';
// Uncaught SyntaxError: unexpected token: identifier
// example #2
// assumption
<% blog = {title: "foo\nbar"} %>

// Then this will result in:
const blog_info = '<%-JSON.stringify(blog)%>';
const blog_info = '{"title":"foo\nbar"}';
console.log(JSON.parse(blog_info));
// Uncaught SyntaxError: JSON.parse: bad control character in string literal at line 1 column 14 of the JSON data

而不是将结果放在字符串上下文中,而是将其直接分配给变量。 JSON 代表 JavaScript Object Notation,与普通 JavaScript* 兼容。这意味着将代码更改为:

const blog_info = <%-JSON.stringify(blog)%>;
console.log(blog_info);

使用与上述相同的示例,结果:

// example #1
// assumption
<% blog = {title: "Let's play Tic-Tac-Toe"} %>

// Then this will result in:
const blog_info = <%-JSON.stringify(blog)%>;
const blog_info = {"title":"Let's play Tic-Tac-Toe"};
console.log(blog_info);
// prints: ⏵ Object { title: "Let's play Tic-Tac-Toe" }
// example #2
// assumption
<% blog = {title: "foo\nbar"} %>

// Then this will result in:
const blog_info = <%-JSON.stringify(blog)%>;
const blog_info = {"title": "foo\nbar"};
console.log(blog_info);
// prints: ⏵ Object { title: "foo\nbar" }

【讨论】:

  • 当我写 const blog_info=&lt;%-JSON.stringify(blog)%&gt;; 时,我的 ide 在尖括号处显示错误,当我尝试记录它时,ide 警告 blog_info 可能未初始化,不会向控制台输出任何内容。我正在 标签 中编写代码
  • IDE 显示的错误是什么?如果没有任何输出到控制台,检查生成的页面(客户端接收的页面)可能是明智的。你已经这样做了吗?您是否发现任何不寻常或与预期不同的地方?
  • 我一直在通过浏览器控制台检查您是否是这个意思
  • 我不是这个意思。检查控制台输出已经是一步之遥了。 EJS 是一种模板语言,可用于生成输出(例如 HTML/JavaScript/CSS 等)。我的问题是输出是否正确或异常。在大多数浏览器中,您可以按 Ctrl + U 来查看页面源代码。如果 JavaScript 不是当前页面的一部分,而是通过 &lt;link&gt; 标记加载的,您可以检查 JavaScript 调试器以获取已加载的 JavaScript 文件,或者查看显示加载了哪些外部 JavaScript 及其内容的网络选项卡。跨度>
  • 哦,是的,这是与 ide 相关的事情,浏览器似乎在源代码中显示得很好。不知道为什么我不能记录它。
猜你喜欢
  • 1970-01-01
  • 2016-06-16
  • 2022-01-21
  • 2014-05-28
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 2022-09-22
  • 1970-01-01
相关资源
最近更新 更多