【问题标题】:JBoss Fuse Scientific Notation in Decimal Field (JSON)十进制字段中的 JBoss Fuse 科学记数法 (JSON)
【发布时间】:2018-07-30 00:37:12
【问题描述】:

我正在使用 Fuse 6.2.1(Switchyard、Apache Camel)和 Maven 开发 Web 服务,但我遇到了我希望它们处理精度高达 23 和2 的刻度。每当我有一个精度超过 7 的值时,格式就会更改为科学记数法。由于我在银行工作,这是市长的问题

我的 XSD 上用于我的服务的示例字段如下:

<xs:element minOccurs="1" name="amount" type="xs:decimal" />

后来我把声明改成这样:

    <xs:element minOccurs="1" name="amount" >
        <xs:simpleType>
            <xs:restriction base="xs:decimal">
                <xs:fractionDigits value="2" />
                <xs:totalDigits value="23"/>
                <xs:pattern value="[0-9][.][0-9]"/>
            </xs:restriction>
        </xs:simpleType>
    </xs:element>

但科学记数法保持不变。在我的 java 代码中,我正在打印变量并且格式正确,更重要的是,我的服务在骆驼内部有 2 条路由,一条用于 SOAP,一条用于 REST (JSON),而 JSON 响应是有问题的, SOAP 效果很好,所以我猜问题是创建 Json 响应,但我不知道如何处理这个

在我的多次测试中,我有一个表,其字段值为“1234567890123456789.00”,在 SOAP 上我得到:1234567890123456789.00 但在 Json 上:“金额”:1.23456789012345677E18

如果有人知道如何解决这个问题,请告诉我

【问题讨论】:

标签: java json maven apache-camel jbossfuse


【解决方案1】:

我没有时间写一个正确的答案,但这一定是你的 JSON 序列化的问题。您的值必须从您的 SOAP 读取到 BigDecimal,然后读取到您的 JSON 中的字符串,该 JSON 必须使用 toString() 函数,该函数将对大数使用科学记数法。

所以要修复你的 Json:如果你构建一个自定义 JSON 序列化器来指定如何序列化 BigDecimal,你想在那里使用 BigDecimal.toPlainString()(当然要确保你设置了比例。我会避免使用MathContext,因为 MathContext 的方式不是超级直观)。

【讨论】:

  • 感谢您的回答。我正在搜索如何创建自定义 JSON 序列化程序。当我开始在这里工作时,该服务的结构已经建立,我以前从未构建过 JSON 文件,老实说,我不确定该服务(或任何其他服务)是如何做到的
【解决方案2】:

我们仅对具有大量数字的字段使用字符串解决了此问题。使用这些的应用程序只需要显示这些数字而不进行任何类型的计算,因此这样做是一种妥协,而且由于我们没有太多时间,唯一可行的解​​决方案是

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多