【问题标题】:How to change the value of a JSON file using arithmetics?如何使用算术更改 JSON 文件的值?
【发布时间】:2021-02-05 21:29:12
【问题描述】:

对不起,如果标题没有意义。

基本上,在我的case.JSON 文件中,我有以下内容:

{
  "case": 0
}

我想要它,这样当代码运行时case 的值会增加1,我可以将它分配到任何地方,因此(discord.js 示例)在 Rich-embed 中我可以将 caseNumber 放在页脚/字段/说明。

我很难理解这一点,因此我们将不胜感激。

每次我重新启动代码时,我都想使用 Node FS 将其保存到我的 JSON 文件中 所以我希望它每次都更新它。

这些是我的previous attempts

// console.log('Starting...')
var fs = require('fs');
var cases = fs.readFileSync('case.json');
var caseUp = cases + 1;
var translateCases = JSON.parse(caseUp);

var data = JSON.stringify(translateCases)
fs.writeFile('case.json', data, finished);
function finished(err){
    console.log('All set.');
}

//////////////////////////////////////////////////// I've tried these 2 seperately ^ v


// console.log(translateCases);

console.log('Starting...')
var caseJSON = require('./case.json');
var caseTest = caseJSON.case[0 + 1]
caseTest = 0;
caseTest += 1;
// caseTestTranslate = JSON.parse(caseTest)

var actualNumber = JSON.stringify(caseTest)
fs.writeFile('case.json', actualNumber, finished)
function finished(err){
    console.log('All good.')
}

console.log(caseTest)

【问题讨论】:

  • 欢迎来到 StackOverflow。如果您还没有这样做,请访问Help Center,使用tour 并在此处阅读asking good questions
  • 我不清楚你到底想做什么。您是否想在每次运行代码块时更新磁盘上的文件。还是您只想更新内存中的值?
  • @ScottSauyet 每次我重新启动代码时,我都想使用 Node FS 将其保存到我的 JSON 文件中,我不确定您所说的“更新磁盘上的文件/更新值”是什么意思在记忆中”。很抱歉给您带来不便
  • 你回答了。您希望每次都更新一个实际文件。你能分享一下你到目前为止的尝试吗?
  • 我的意思是我刚刚更新它的方式。实际上直接在问题中包含相关代码。现在很好,现在我已经做到了。但是下一次,虽然链接可以提供更多上下文,但重要的代码应该包含在问题中。

标签: javascript json discord.js


【解决方案1】:

你快到了!仔细看顺序:

var cases = fs.readFileSync('case.json'); // is a string
var caseUp = cases + 1; // string + number => string, which is not what you wanted
// for this case, you can parse the filecontents first with JSON.parse on the file contents

或者,你在下面的代码中做了什么

var caseJSON = require('./case.json'); // now caseJSON is directly parsed as an object
// so caseJSON.case contains the value you want to increment

使用这种方法,它看起来像这样:

var fs = require('fs');

console.log('Starting...')
var caseJSON = require('./case.json');
var caseJSONIncremented = { case: caseJSON.case + 1 }

var fileContent = JSON.stringify(caseJSONIncremented)
fs.writeFile('case.json', fileContent, finished)

function finished(err){
    console.log('All good.')
}

【讨论】:

  • 非常感谢!几个月来我一直试图解决这个问题,但我“害怕”寻求帮助。非常感谢!
  • @Craig:不要害怕寻求帮助!通常有人愿意并且能够提供。
  • @Craig np,很高兴为您提供帮助;)请勾选解决方案,以便其他人知道问题已解决
  • @Craig - 您需要记住 JSON 是 javacript 对象的文本表示;作为文本,它需要被 解析 以将其转换为实际的 Javascript —— require 正如 Raymonzut 所展示的那样进行解析,或者更明确的 let object = JSON.parse(theText) 也进行解析。
【解决方案2】:

Raymonzut 已经为您的第二次尝试显示了修复方法。以下是您的第一个注释:

var fs = require('fs');
var cases = fs.readFileSync('case.json');

首先,在现代 JS 中,var 通常不被推荐。可以使用const,必要时使用let

如果您要使用 Sync API,您可能需要使用 try-catch 来处理打开文件时遇到的任何问题。

请注意,现在cases 将保存一个字符串(如果没有错误)。您必须在此结果上调用JSON.parse 以返回一个对象。所以这两行是乱序的:

var caseUp = cases + 1;
var translateCases = JSON.parse(caseUp);

但你不能只是切换它们,因为你的类型不会对齐。我的建议如下。

var data = JSON.stringify(translateCases)
fs.writeFile('case.json', data, finished);
function finished(err){
    console.log('All set.');
}

我不建议将同步和异步 API 组合在同一个代码块中。

一个(未经测试的)修复看起来像这样:

const fs = require('fs');

try {
  const str = fs.readFileSync('case.json')
  const obj = JSON.parse(str)
  // This does not change obj, but creates a clone with an updated version of `cases`
  const updatedObj = {
    ... obj
    cases: (obj.cases || 0) + 1
  }
  fs.writeFileSync('case.json' JSON.stringify(updatedObj))
} catch (e) {
  // do something here with your error.
}

这允许您的配置对象在您以后需要时拥有多个属性,而不仅仅是cases


请注意,这不是我将如何解决这个问题。我会使用Promiseasync-await 代码而不是fs 的同步或异步样式。但这是以类似方式快速解决您原来的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-17
    • 2021-10-25
    • 2019-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-04
    • 1970-01-01
    相关资源
    最近更新 更多