在 Java 中将 BigDecimal 字段作为 JSON 字符串值返回

rog*_*hat 9 java rest json get bigdecimal

我有一个Get API返回一个JSON. 预期的格式是:

{
   "value1": "123.00",
   "value2": "23.00"
}
Run Code Online (Sandbox Code Playgroud)

这些值位于BigDecimal对象中:

public class Result{
    BigDecimal value1;
    BigDecimal value2;
    // getters and setters
}
Run Code Online (Sandbox Code Playgroud)

现在,当发出请求时,我创建Result对象并将这些值填充为BigDecimal,创建一个列表并返回。我收到的回复是:

{
   "value1": 123.00,
   "value2": 23.00
}
Run Code Online (Sandbox Code Playgroud)

这些值是正确的,但不是字符串。我怎样才能把它们做成绳子?

我知道我们可以转换BigDecimal为,String但我只有 BigDecimal 字段的对象,并且无法向其填充 String 值。

最后,列表是这样制作的:

List<MyObj> obj = Arrays.stream(myObj).collect(Collectors.toList());

    Result result = new Result();

    obj.forEach(t -> t.mergeToResult(result));  // mergeToResults does all the population like result.setValue1(new BigDecimal(123.00))

    return result;
Run Code Online (Sandbox Code Playgroud)

Paw*_*mar 7

您可以使用@JsonFormat注释,如下所示:

import com.fasterxml.jackson.annotation.JsonFormat;

public class Result {        
   @JsonFormat(shape = JsonFormat.Shape.STRING)
   private BigDecimal value;

   // getters and setters
}
Run Code Online (Sandbox Code Playgroud)


Bas*_*que 3

使用String

\n\n

根据我对维基百科页面的阅读,按照 JavaScript 的传统行为, JSON 中的类型Number可能被视为浮点数。浮点技术为了执行速度而故意牺牲精度。

\n\n

该类BigDecimal的目的恰恰相反,为了准确性而牺牲执行速度。

\n\n

因此,如果您希望最大程度地保值BigDecimal,请存储为String. 希望这种方法可以减少 JSON 的使用者无意中将传入值解析为浮点的情况。向那些使用 JSON 的人清楚地记录您将数据解析为浮点数BigDecimal或等效数据而不是浮点数的意图。

\n\n

Java 导出:

\n\n
String output = myBigDecimal.toString() ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

JSON:

\n\n
{\n   "value1": "123.00",\n   "value2": "23.00"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

Java 导入:

\n\n
BigDecimal bd = new BigDecimal( "123.00" ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n

BigDecimal::toString研究和的文档new BigDecimal( string )。您还应该了解该BigDecimal::toPlainString方法。

\n\n

\n\n

至于你的Java流,我不明白你的问题。您对List和 数组的使用是无法解释的。

\n\n

基本上,您应该toJson在您的类上实现一个方法ResultResult::toJson在流代码中调用该方法。

\n\n

这是此类的一个示例。

\n\n
package com.basilbourque.example;\n\nimport java.math.BigDecimal;\n\npublic class Result {\n\n    BigDecimal start, stop;\n\n    public String toJson () {\n        StringBuilder sb = new StringBuilder( "{\\n" );\n        sb.append( "    " );  // Indent with four spaces.\n        sb.append( this.enquote( "start:" ) + " " );\n        sb.append( this.enquote( start.toString() ) );\n        sb.append( " , \\n" );\n        sb.append( "    " );  // Indent with four spaces.\n        sb.append( this.enquote( "stop:" ) + " " );\n        sb.append( this.enquote( stop.toString() ) );\n        sb.append( "\\n}\\n" );\n        return sb.toString();\n    }\n\n    static public Result fromJson ( String json ) {\n         \xe2\x80\xa6\n    }\n\n    private String enquote ( String string ) {\n        return "\\"" + string + "\\"";\n    }\n\n    // Constructor\n    public Result ( BigDecimal start , BigDecimal stop ) {\n        this.start = start;\n        this.stop = stop;\n    }\n\n    public static void main ( String[] args ) {\n        Result r = new Result( new BigDecimal( "123.00" ) , new BigDecimal( "23.00" ) );\n        System.out.println( r.toJson() );\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

运行时。

\n\n
{\n    "start:" "123.00" , \n    "stop:" "23.00"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

考虑一个框架

\n\n

提示:您可能需要考虑使用 JSON\xe2\x86\x94Java 映射框架来帮助您完成这项工作。

\n