【发布时间】:2016-07-14 06:45:26
【问题描述】:
我知道对象的属性不能保证以任何特定顺序存储或读取。
我遇到的问题是我不能使用对象或数组。我已经有一个像这样的大且非常嵌套的 JSON 文件:
{ "occasion": 23, "mayorstips": { "1": 0, "3": 0, "2": 0...
我只需要做一些修改。这就是我开始使用它的方式:
var campaign = JSON.parse(fs.readFileSync(theJSONFile));
for(var plot in plots) {
if(plots.hasOwnProperty(plot)) {
switch(plots[plot].province) {
case 'forest':
...
当我完成后,我只是把它放回去:
fs.writeFileSync(theJSONFile, JSON.stringify(campaign));
现在,我注意到这种方法存在两个问题:
- 原始间距格式丢失。该原始文件只是一长行,并且必须是一长行,因此
JSON库的任何格式化尝试都没有帮助。我用一些正则表达式替换解决了它。 - 现在“JSON 行”文件已排序。所以我从
{ "1": 0, "3": 0, "2": 0转到{ "1": 0, "2": 0, "3": 0,结果发现这是个大问题。 - 以 0 结尾的浮点数将被截断。该文件需要浮点数始终有六位小数,例如,34.293800。但是当我打开它时,数字变为34.2938!
这是一个 35,000 个字符的行。这是如何解决问题 #2 和 #3?我可以为#3 做另一个正则表达式替换,但也许我缺少一些东西。
【问题讨论】:
-
您正在阅读的 json 文件,是您创建的还是您从某个地方获取的?如果它是由您创建的,我强烈建议您更改其结构。如果任何地方的顺序对您很重要,最好将它们保存在数组中而不是对象属性中。如果 0 对您很重要,请将这些数字保存在字符串中
-
它说这不取决于他。我看到的唯一选择是将数据推送到数组中以保持顺序,然后将其转换回来。这不能纯粹用 JSON 来完成,因为每个 JS 引擎对它的排序都不同。 stackoverflow.com/questions/8931967/…
-
对于这种受限的用例,我建议进行字符串操作,进行子字符串搜索并找到键及其值。然后替换/操作字符串。尽管这种方法效率低下,但考虑到您的限制......
-
@shinobi 这不是我创建的,这就是问题所在。这是我试图根据自己的喜好修改的软件的输出,它似乎对排序和所有其他东西非常挑剔。
-
@NidhinDavid 恐怕你是对的,它实际上是我现在使用正则表达式替换的代码的一半。我只是在寻找我没有的绝妙想法。
标签: javascript arrays json node.js