【问题标题】:Unexpected string when outputting textfile输出文本文件时出现意外的字符串
【发布时间】:2016-08-25 01:34:27
【问题描述】:

我有一些数据正在尝试输出到输出文本文件。这就是我尝试这样做的方式:

'use strict';
var fs = require('fs');

let id = require('./ID.json');
let obj = require('./dataOut.json');
let isp = require('./isp');
let dst = require('./dst');
let dst_lat = require('./dst_lat');
let dst_lng = require('./dst_lng');

const output = [];
let i = 0;

obj.forEach(block => {
    let outputOut = 
        '    {\n',
        '      "_id": ' + '"' + id[i] + '",\n',
        '      "latlng": [\n',
        '        ' + dst_lat[i] + ',\n',
        '        ' + dst_lng[i] + '\n',
        '       ],\n',
        '       "name":' + '"' + isp[i] + '",\n',
        '       "address":' + '"' + dst[i] + '"\n',
        '},\n';
        output.push(outputOut);
    i++;
});
fs.writeFile('./output.json');

我希望数据准确地显示在变量 outputOut 中,但是,当我运行此代码时,我遇到了错误 unexpected string

我明白为什么会遇到此错误,但我想不出解决方法。

如何将我的 outputOut 数据保存到文本文件中?

【问题讨论】:

  • 为什么要用字符串手动构建 json?你可能误会JSON.stringify。它接受一个 javascript 对象或一个有效的 JSON 对象并返回它的字符串版本。您的字符串连接是多余的和不必要的。尝试构建一个对象。
  • 嗨@Seth,我可能应该从这篇文章中删除 json.Stringify。我会编辑它。至于构建一个对象,我应该,但我想知道这种方法是否可行。
  • 但它不是代码中字符串的一部分。也许您需要Template string
  • javascript 中的字符串连接是用+ 完成的,而不是,
  • 你做错了。 JSON.stringify(theobject,null,2) 永远不要手动构建 json...如果您需要附加到现有的 json 文件,请读取文件、解析它、修改它并重新编写它。

标签: javascript arrays json node.js


【解决方案1】:

您可能误解了JSON.stringify。它接受一个 javascript 对象或一个有效的 JSON 对象并返回它的字符串版本。您的字符串连接是不必要的。其次,您实际上错误地连接了outputOut。像这样连接:var saying = "Hello" + "World";

尝试构建一个对象:

'use strict';
const fs = require('fs');

const id = require('./ID.json');
const obj = require('./dataOut.json');
const isp = require('./isp');
const dst = require('./dst');
const dst_lat = require('./dst_lat');
const dst_lng = require('./dst_lng');

const output = [];
let i = 0;

obj.forEach(block => {
    let outputOut = {
      "_id": id[i],
      "latlng": [
        dst_lat[i],
        dst_lng[i],
      ],
      "name": isp[i],
      "address": dst[i],
    }

    output.push(outputOut);
    i++;
});

fs.writeFile('./output.json', JSON.stringify(output, null, 2), 'utf-8');

这种方法更加地道和简单。此外,它更易于阅读。让 JavaScript 为您完成繁重的工作,而不是编写仍然可以达到相同结果但成本更高的复杂代码。

最后,更实用的方法是使用Array.prototype.map

'use strict';
const fs = require('fs');

const id = require('./ID.json');
const obj = require('./dataOut.json');
const isp = require('./isp');
const dst = require('./dst');
const dst_lat = require('./dst_lat');
const dst_lng = require('./dst_lng');

const output = obj.map((block, i) => {
  return {
    "_id": id[i],
    "latlng": [
      dst_lat[i],
      dst_lng[i],
    ],
    "name": isp[i],
    "address": dst[i],
  };
});

fs.writeFile('./output.json', JSON.stringify(output, null, 2), 'utf-8');

这种方法避免了每次迭代都需要改变output,并利用回调函数中的索引而不是递增计数器变量。

【讨论】:

  • 我误解了这个方法在输出中的样子,我没有意识到我可以这样做。谢谢,这更有意义,而且比我所做的更清楚。
  • 用更简洁的方法为您更新了答案@Bryce。这将减少您的代码行数和变量。
【解决方案2】:

正如我所见,您尝试自己创建 JSON 文本。问题是您没有连接字符串部分,而是使用了逗号表达式(并且没有将其放在括号中。如果这样做,它仍然是有缺陷的,因为逗号表达式不会连接字符串,而是保留最后一个)。

要记住的一件事:不要尝试创建自己的 JSON 表单字符串。人们已经为你做了。您所要做的就是正确映射这些对象,然后调用JSON.stringify

'use strict';
var fs = require('fs');

let id = require('./ID.json');
let obj = require('./dataOut.json');
let isp = require('./isp');
let dst = require('./dst');
let dst_lat = require('./dst_lat');
let dst_lng = require('./dst_lng');

const output = obj.map((block, i) => {
  return {
    _id: id[i],
    latlng: [
      dst_lat[i],
      dst_lng[i]
    ],
    name: isp[i],
    address: dst[i]
  };
});

fs.writeFile('./output.json', JSON.stringify(output, null, 2), 'utf-8');

【讨论】:

    【解决方案3】:

    除了你使用的方法错误,如果你想在javascript中连接一个字符串,你需要使用+,而不是,

    let outputOut =
        '    {\n' +
        '      "_id": ' + '"' + id[i] + '",\n' +
        '      "latlng": [\n' +
        '        ' + dst_lat[i] + ',\n' +
        '        ' + dst_lng[i] + '\n' +
        '       ],\n' +
        '       "name":' + '"' + isp[i] + '",\n' +
        '       "address":' + '"' + dst[i] + '"\n' +
        '},\n';
    output.push(outputOut);
    

    这就是您的错误的来源。

    已经发布的其他答案将向您展示做您想做的事情的正确方法

    【讨论】:

    • 投反对票的人,您不同意答案的哪一部分?
    • 不是反对者,但不应该详细说明实现(手动 JSON 字符串构建)。这不是一种应该使用或宽恕的做法。应该使用替代方法,因为 OP 没有指定它们需要字符串连接。
    • @baao 这是我最初需要的答案,非常感谢。出于上述原因,我决定采用 Seth 的解决方案,但是我也从您的帖子中学到了一些东西。谢谢!
    • 你应该选择他的解决方案,是的! @布莱斯
    • @Seth 是的。这就是为什么我在我的回答中写了这个 - 并且 +1 你......但我认为展示某人所犯的实际错误是件好事......我将重要部分加粗...... :-)
    猜你喜欢
    • 2012-05-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-27
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 2022-01-01
    • 2021-08-22
    相关资源
    最近更新 更多