如何使用算术更改 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
。
请注意,这不是我将如何解决这个问题。我会使用Promise
或async-await
代码而不是fs
的同步或异步样式。但这是以类似方式快速解决您原来的问题。
【讨论】:
以上是关于如何使用算术更改 JSON 文件的值?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Json.NET 更改 JSON 属性的值? [关闭]
如何使用 Codable 解码具有更改键的 json 响应?