在 graphql-spqr 中以 Double 值对 NaN 建模

Posted

技术标签:

【中文标题】在 graphql-spqr 中以 Double 值对 NaN 建模【英文标题】:Model NaN in a Double value in graphql-spqr 【发布时间】:2020-01-05 13:36:16 【问题描述】:

在Graphql 和JSON 中都没有表示NaN 和INFINITY 的标准。

javascript 中,JSON.stringify(0/0)JSON.stringify(1/0) 只会返回字符串 null

当我提供支持 Java 的 GraphQL 端点时,它几乎不会造成任何麻烦。我的值可以是 Java 中任何有效的 Double

    @GraphQLQuery
    private Double precentage;

我几乎没有解决方法,我可以在我正在做的设置器中对其进行修补。 只是想知道是否有事实上的标准可以更好地处理它。

【问题讨论】:

我没有使用 Java 实现,但我想您应该能够通过创建 GraphQLScalarType 类的实例来创建自定义标量类型,如 here 所示。通过这种方式,您可以创建一个标量,该标量可以接受例如"NaN"、“Infinity”和任何浮点值作为有效值。 【参考方案1】:

我在某个时候也在考虑这个问题...... 目前的情况是Double(Java 类型)被映射到 GraphQL 的Float 标量,它不能表示NaN 或无穷大。 你可以做的是实现你自己的标量(例如Double)并决定如何处理这些特殊情况(使用现有的标量实现作为指导)。也许使用NaN+Infinity-Infinity 之类的字符串?最糟糕的是,无论您采用何种约定,客户端也需要了解它,因为 JSON 也没有这些值的表示形式。

一旦您有了满意的自定义标量,您就可以实现一个超级简单的TypeMapper,它支持Double(Java 类型)并返回这个新标量。

或者回答您最初的问题 - 不,不幸的是,在 graphql-java 或 SPQR 中还没有任何现成的东西。但我很高兴扩展 SPQR 的自定义标量来处理这个问题......如果你想出了一个好的策略,请联系我。

【讨论】:

以上是关于在 graphql-spqr 中以 Double 值对 NaN 建模的主要内容,如果未能解决你的问题,请参考以下文章

具有弹簧安全性的 JWT 身份验证 graphql-spqr

graphql-spqr 无法查询父类字段

Code ::在Windows中以固定精度阻止printf double

使用 graphql-spqr、java 和 mongo 进行中继分页

在 JPA 中以实体为键映射 Map

如何在 Scala 中以元组为键合并 Maps