提问者:小点点

更改对象中键的数据类型


我有一些从数据库返回的对象。 当我构建我的表时,这些是我声明的dType:

  1. festivalid=bigint
  2. PerformanceID=BigInt
  3. 开始时间=时间
  4. endtime=时间

当我想用特定的performanceId提取一些记录时,我的查询如下所示:

SELECT performanceId, to_char(startTime, 'HH24MI') AS startTime, to_char(endTime, 'HH24MI') AS endTime FROM Performance WHERE festivalId = $1

并将从postgresql返回的整个结果串联到一个对象中。

现在的问题是,用于中间件的javascript正在将每个对象中的每个performanceId(意味着每个唯一的performanceId)作为字符串而不是整数类型读取。 例如,performanceId 1234567890打印为“1234567890”而不是1234567890。

我可以将performanceId输出转换为整数吗?

我尝试在执行sqlselect语句时将其转换为整数,

SELECT CAST(performanceId AS INTEGER) AS performanceId, to_char(startTime, 'HH24MI') AS startTime, to_char(endTime, 'HH24MI') AS endTime FROM Performance WHERE festivalId = $1

但我意识到它是不同的,因为INTEGER和Bigint有不同的接受范围。

null

我不知道我上面的帖子有没有误导,所以我决定在这里放一些虚设输出:

这是意外输出:

{
  "result": [
    {
      "performanceid": "9999999999",
      "starttime": "0900",
      "endtime": "1200"
    }
  ]
}

这是预期的输出:

{
  "result": [
    {
      "performanceid": 999999999,
      "starttime": "0900",
      "endtime": "1200"
    }
  ]
}

共1个答案

匿名用户

JS BigInt是相当新的,但它也不是JSON标准的一部分。

因此,您的输出是正确的,因为虽然字符串可以包含任意数量的数字/字符,但以9007199254740991N为值的JSON可能会到处失败。

解决这个问题的一种方法是使用json.parse恢复函数,当键为PerformanceID时,返回您想要的任何内容

JSON.parse(data, (k, v) => k == 'performanceid' ? BigInt(v) : v);

此时,您负责确保Browser/JS引擎与bigint兼容,如果不兼容,则最终提供一个回退(可能将其保留为字符串)。

如果您正在使用fetch(data)。then(b=>b.json()),那么您也应该绕过它而使用fetch(data)。then(b=>b.text())。then(data=>json.parse(data,reviver)),这样您的fetch操作将产生所需的结果。