【问题标题】:How to write an js object into a json-file如何将 js 对象写入 json 文件
【发布时间】:2021-05-20 03:10:48
【问题描述】:

现在我想写这个:

我的JSON表

在 JSON 文件中,我有以下方法:

    fs.writeFile('./users.json', JSON.stringify(myJSONtable, null, 4), 'utf-8', function (err) {
        if (err) throw err
        console.log('Done!')
    })

我不得不说我不确定“fs.writeFile”是否是正确的方法。

我的 Json 文件应如下所示:

{
    "Startordner": [
        "C:/GIT/Aktuell/zipper/startordner/"
    ],
    "Speicherorte": [
        "C:/GIT/Aktuell/zipper/zielordner/"
    ],
    "Ignore": [
        "STM32F030RC",
        "Dateinamensliste"
    ],
    "Satz": [
        {
            "Ursprungsdateien": "placeholder1",
            "NeuerName": "placeholder1",
            "Revision": "05"
        },
        {
            "Ursprungsdateien": "placeholder2",
            "NeuerName": "placeholder2",
            "Revision": "04"
        },
        {
            "Ursprungsdateien": "placeholder3",
            "NeuerName": "placeholder3",
            "Revision": "02"
        },
        {
            "Ursprungsdateien": "placeholder4",
            "NeuerName": "placeholder4",
            "Revision": "02"
        }
    ]
}

但我只在这里得到这个:

[]

myJSONtable 如下所示:

[Startordner: Array(1), Zielordner: Array(1), Ignore: Array(1), Satz: Array(12)]
Ignore: Array(1)
0: {Ignore: Array(2)}
length: 1
__proto__: Array(0)
Satz: Array(12)
0: {Ursprungsdateien: "placeholder1"}
1: {NeuerName: "placeholder1"}
2: {Revision: "05"}
3: {Ursprungsdateien: "placeholder2"}
4: {NeuerName: "placeholder2"}
5: {Revision: "04"}
6: {Ursprungsdateien: "placeholder3"}
7: {NeuerName: "placeholder3"}
8: {Revision: "02"}
9: {Ursprungsdateien: "placeholder4"}
10: {NeuerName: "placeholder4"}
11: {Revision: "02"}
length: 12
__proto__: Array(0)
Startordner: [{…}]
Zielordner: Array(1)
0: {Zielordner: Array(1)}
length: 1
__proto__: Array(0)
length: 0
__proto__: Array(0)

我仍然可以得到帮助,在此先感谢。

【问题讨论】:

  • 你需要序列化你的对象。 myJSONtable的类型是什么?
  • 这是一个数组 -> var myJSONtable = [];

标签: javascript node.js arrays json npm


【解决方案1】:

myJSONtable 变量很可能是带有 getters 的类的数组。它们在 JSON.stringify() 输出中不可见。

您可以在该类中编写自己的序列化方法,在该类中手动返回手动调用每个字段值的对象,或使用诸如 class-transformer 之类的专用库:

import { classToPlain, Expose } from "class-transformer";

class Satz {
  constructor(ursprungsdateien, neuerName, revision) {
    this.ursprungsdateien = ursprungsdateien;
    this.neuerName = neuerName;
    this.revision = revision;
  }
}

const item1 = new Satz("placeholder1", "placeholder1", "05");
const item2 = new Satz("placeholder2", "placeholder2", "06");

class SomeClass {
  @Expose()
  get startordner() {
    return "C:/GIT/Aktuell/zipper/startordner/";
  }

  @Expose()
  get speicherorte() {
    return "C:/GIT/Aktuell/zipper/zielordner/";
  }

  @Expose()
  get ignore() {
    return ["STM32F030RC", "Dateinamensliste"];
  }

  @Expose()
  get satz() {
    return [item1, item2];
  }
}

const someClass = [new SomeClass()];

// this returns only [{}]
console.log(JSON.stringify(someClass, null, 4));

const someClassPlain = classToPlain(someClass);

// this returns all getters
console.log(JSON.stringify(someClassPlain, null, 4));

默认情况下,库会忽略 getter,但您可以使用 Expose 装饰器强制它们在序列化后可见。如果你不能在你的项目中使用装饰器,那么回退总是编写你自己的序列化方法。

这里是 stackblitz 链接:https://stackblitz.com/edit/stackoverflow-66238400?file=index.js

【讨论】:

  • 那看起来很不错,但是我的问题是我必须使用对象,我不能写一些硬的东西,因为我不知道会来什么数据。
  • 它应该只显示 json 文件中的结构,我对内容的反应不一
  • 好的。因此,也许让我们澄清一下您从哪里获得 myJSONtable 变量。因为显然该变量有问题,它阻止了它被序列化。 JavaScript 中没有对象的私有成员。您可以 console.log myJSONtable[0].Satz 或该结构的任何其他部分吗?
  • 另外请尝试 console.log 序列化变量或其中的一部分而不保存到文件中。如果它会输出正确的字符串,那么它是文件问题,如果不是它是变量问题。您也可以尝试使用 fs.writeFileSync()。也许那里存在一些异步数据问题 - 通常很奇怪。
【解决方案2】:

我在其他地方寻找解决方案并找到了它。我的问题只是我填充了一个数组,解决方案很简单,我只需要填充一个对象,为此我只是将声明 dof myJSONtable 更改为。

var myJSONtable = {};

仍然感谢您的帮助。 很抱歉打扰,我希望其他人可以处理我的问题和以下答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-25
    • 2017-12-22
    • 2021-10-15
    • 2020-07-18
    • 1970-01-01
    相关资源
    最近更新 更多