在上传到 Firebase 实时数据库时,如何避免以数字作为键的 JSON 对象被解释为数组?

How to avoid a JSON object with numbers as keys getting interpreted as an array when uploading to Firebase Real Time Database?

我正在使用带有枚举的 Typescript 来创建一些动态对象结构。这些枚举在对象中表示为数字,而不是它们的字符串值,我想保持原样。当我将这些对象上传到 Firebase RTDB 时,这些对象被误解为数组。

打字稿中的枚举示例

enum TableState {
  Standby = 0,
  Idle,
  In_Game,
  Maintenance,
}

Javascript 对象我想上传到 Google RTDB

configuration_per_state: {
  [TableState.Idle]: {
    brightness: 10,
  },
  [TableState.In_Game]: {
    brightness: 10,
    duration: 20 * 60, //20 minutes,
  }
}

这是以下字符串化的 JSON:

{
    "configuration_per_state": {
        "1": {
            "brightness": 10
        },
        "2": {
            "brightness": 10,
            "duration": 120
        }
    }
}

我现在面临的问题是,当上传到 Firebase 实时数据库时,对象被解释为数组。因此,当我想检索数据时,对象结构已被数据库更改。

上传对象的代码:

const createInitialConfigInDb = (
  tableConfig: InitialTableState): Promise<any> => {
  return new Promise((resolve, reject) => {
    const userId = auth.currentUser?.uid
    db.ref(`config/${userId}/general`).set(tableConfig).then((data) => {
      //success callback
      resolve(data)
    }).catch((error) => {
      //error callback
      reject(error)
    })
  })
};

上传到数据库并从 RTDB 下载后得到 JSON:

{
  "configuration_per_state" : [ null, {
    "brightness" : 10,
  }, {
    "brightness" : 10,
    "duration" : 1200,
  } ],
}

首先我不明白为什么有一个条目“null”作为第一个数组条目... 其次,有没有一种简单的方法可以避免这种行为?

Firebase 将您的数据解释为数组,它添加的 null 表示数组中索引 0 处没有元素。

无法配置 Firebase 实时数据库的数组 coercion/interpretation。

防止它将您的数据解释为数组的唯一方法是不使用数字键。

我常用的解决方案是在这些键前加上一个简短的常量字符串值。例如:

{
  "configuration_per_state" : {
    "key_1": 
      "brightness" : 10,
    }, 
    "key_2": {
      "brightness" : 10,
      "duration" : 1200,
    }
  }
}