javascript - 无法获得正确的 JSON 格式,相反我搞砸了

标签 javascript json vue.js

我想要什么?

问得好,不是吗?出色地... 我正在开发一个使用 electron-vue 计算预算的应用程序。 在我的应用程序中,我尝试将用户保存在一个 JSON 文件中,以便在应用程序重启后创造一个保留他们的机会。

JSON 文件应如下所示:

{
    "deniz": {
        "salary": 1234,
    },
    "hüseyin": {
        "salary": 4321,
    }
}


我得到了什么?

我得到的是这个:

{
    "deniz": {
        "salary": 1234
    }
}{
    "hüseyin": {
        "salary": 4321
    }
}

问题是,它是错误的 JSON 格式。我正在一个对象中创建一个全新的对象。


我该怎么做?

我创建了一个 userDataControllerMixin.js 来将逻辑与其自身的组件分开。

我的组件中有两个 InputFields,1.userName 和 2.userSalary 用于收集用户数据。

在我的 userDataControllerMixin.js 中:

export const userDataControllerMixin = {
  data() {
    return {
      userDataAbsPath: 'src/data/userData.json',
    };
  },
  mounted() {
    this.getUsers();
  },
  methods: {
    // FETCH THE userData.json
    getUsers() {
      const fs = require('fs');
      const loadJSON = fs.readFile('src/data/userData.json', 'utf8', (err, data) => {
        if (err) {
          console.log(`failed to read file: ${err}`);
        }
        // console.log(data);
      });
      return loadJSON;
    },
    // USING THIS CONSTRUCTOR TO BUILD A JSON FORMAT
    User(user, salary) {
      this[user] = {
        salary: Number(salary),
      };

      return user;
    },
    // GET INPUT FROM USERS INPUTBOX
    getInput(inputName, inputSalary) {
      const userName = this.inputName;
      const userSalary = this.inputSalary;
      const user = new this.User(userName, userSalary);
      console.log(user);
      this.createOrLoadJSON(user);
    },
    // CREATES A JSON WITH DATA FROM THE USERS
    createOrLoadJSON(data) {
      const fs = require('fs');
      const json = JSON.stringify(data, null, 4);

      if (fs.existsSync(this.userDataAbsPath)) {
        console.log('file exists!');
        fs.appendFileSync(this.userDataAbsPath, json);
      } else {
        console.log('file not exists!');
        fs.writeFile(this.userDataAbsPath, json, (error) => {
          if (error !== null) {
            console.log(error);
          }
        });
      }
      this.postUsers();
    },
    // PRINTS DATA FROM userData.json TO DOM
    postUsers() {

    },
  },
};

我该如何解决这个问题?

最佳答案

问题是,appendFile 方法不是 concat 方法。它只是一个接一个地添加一些文本。

你必须先用 Object.assign 连接你的 json。

createOrLoadJSON(data) {
  const fs = require('fs');

  if (fs.existsSync(this.userDataAbsPath)) {
    console.log('file exists!');
    const existingJSON = fs.readFileSync(this.userDataAbsPath, "utf8"); // read file and return encoded value
    const newJSON = Object.assign(JSON.parse(existingJSON), data); // concatenate file value and new data
    fs.writeFile(this.userDataAbsPath, JSON.stringify(newJSON, null, 4)); // rewrite file
  } else {
    console.log('file not exists!');
    fs.writeFile(this.userDataAbsPath, JSON.stringify(data, null, 4), (error) => { //  if file does not exist stringify data here
      if (error !== null) {
        console.log(error);
      }
    });
  }
  this.postUsers();
},

工作示例:

// proper concat with Object.assign
var assign = {
  foo: 'bar'
};
var assign2 = {
  bar: 'baz'
};

var assign3 = Object.assign(assign, assign2);
console.log('Object assign: ', assign3);

// appendFile look more like this
var append = {
  foo: 'bar'
};
var append2 = {
  bar: 'baz'
};
var append3 = JSON.stringify(append) + JSON.stringify(append2);
console.log('fs.appendFile: ', append3);

关于javascript - 无法获得正确的 JSON 格式,相反我搞砸了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56998509/

相关文章:

javascript - 如何过滤/搜索返回父级和子级的嵌套树

javascript - 如何在 javascript 中将日期时间微格式转换为本地时间?

html - Vuetify 动画 v-data-table

javascript - 无法使用下划线 throttle Vue.js 获取高度值

vue.js - VueJS 从实例访问组件

javascript - 在 jQuery 中转义撇号

java - 实现匿名用户投票

java - 使用 Android 版 Youtube API 在应用程序中显示 YouTube 视频

c# - 如何在 C# 中遍历复杂的嵌套 Json 并将一组值附加到同一个 Json 中

javascript - 使用 Node js 请求模块从 API 获取 JSON,无法访问子类别