抑制JSLT中的科学/指数表示法

时间:2020-10-14 23:31:26

标签: java json

我正在转换一个Json文档,该文档包含一个值为30000000.00的数字字段。

我正在使用以下规范在Java中进行转换(在相关行之后已被截断):

    StringBuilder jsltSpec = new StringBuilder();

    jsltSpec.append("import \"http://jslt.schibsted.com/2018/experimental\" as exp ");

        jsltSpec.append("def timeVal(obj) " +
                "if ($obj) " +
                "if (size($obj) == 5) " +
                "format-time(parse-time(join($obj, \"-\"), \"yyyy-M-d-HH-mm\"), \"yyyy-MM-dd'T'HH:mm:ss.SSSX\") " +
                "else " +
                "format-time(parse-time(join($obj, \"-\"), \"yyyy-M-d-HH-mm-ss\"), \"yyyy-MM-dd'T'HH:mm:ss.SSSX\") " +
                "else " +
                "null ");

        jsltSpec.append("def dateVal(obj) " +
                "if ($obj) " +
                "format-time(parse-time(join($obj, \"-\"), \"yyyy-M-d\"), \"yyyy-MM-dd'T'HH:mm:ss.SSSX\") " +
                "else " +
                "null ");

        jsltSpec.append("let nestedTran = " +
                "[ " +
                "for (.responseBody.eelaccountsList) " +
                "let sa = " +
                "{ " +
                "\"Transactions\" : " +
                "[ " +
                "for (.transactions) " +
                "let st = " +
                "{ " +
                "\"@type\" : .\"@type\"," +
                "\"accountId\" : .accountId, " +
                "\"amount\" : .amount, " +
                "\"category\" : .category, " +

产生的数量字段为3.0E7,下游消费者不接受。

有人知道是否存在可用于抑制指数符号的格式化功能吗?

谢谢

大卫

1 个答案:

答案 0 :(得分:0)

这实际上不是JSLT问题。由于您的转换内容为:

  "amount" : .amount, 

JSLT根本不更改金额。输出中将传递与JSLT相同的JsonNode对象。从字面上看是同一对象-它们将与==相等。

这是关于Jackson如何序列化十进制文字的信息。

请注意,3.0E730000000.00是相同的数字,因此这纯粹是一个语法问题。实际的基础编号是相同的。

您可以尝试在ObjectMapper中设置this feature,以告诉杰克逊不要使用科学计数法。