如何使用算术更改 JSON 文件的值?

Posted

技术标签:

【中文标题】如何使用算术更改 JSON 文件的值?【英文标题】:How to change the value of a JSON file using arithmetics? 【发布时间】: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)

【问题讨论】:

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

【讨论】:

以上是关于如何使用算术更改 JSON 文件的值?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Json.NET 更改 JSON 属性的值? [关闭]

如何使用 Codable 解码具有更改键的 json 响应?

如何在 JavaScript 中将字符串转换为 JSON?

如何使用 python 更新嵌套 JSON 文件中的值?

如何使用 c# Visual Studio 更改 XML 文件中的值

如何使用Javascript读取json文件并将特定键的值写入同一json文件中?