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

问题描述 投票:2回答:1

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

{
   "value1": "123.00",
   "value2": "23.00"
}

这些值是对象中的BigDecimal

public class Result{
    BigDecimal value1;
    BigDecimal value2;
    // getters and setters
}

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

{
   "value1": 123.00,
   "value2": 23.00
}

值是正确的但不是字符串。我怎样才能让他们成为弦乐?

我知道我们可以将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;
java json rest get bigdecimal
1个回答
0
投票

Use String

根据JavaScript的传统行为,根据我对Number的阅读,JSON中的floating-point类型很可能被视为Wikipedia page数字。为了执行速度,浮点技术故意牺牲精度。

BigDecimal类具有完全相反的目的,为了准确性而牺牲执行速度。

因此,如果您想要保留BigDecimal值的最佳机会,请存储为String。希望这种方法使得JSON的使用者不太可能无意中将传入值解析为浮点值。清楚地向那些使用你的JSON的人们记录你打算将数据解析为BigDecimal或等效而不是浮点的人。

Java导出:

String output = myBigDecimal.toString() ;

JSON:

{
   "value1": "123.00",
   "value2": "23.00"
}

Java导入:

BigDecimal bd = new BigDecimal( "123.00" ) ;

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

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

基本上,你应该在你的toJson类上实现Result方法。在流代码中调用Result::toJson方法。

这是这样一个类的一个例子。

package com.basilbourque.example;

import java.math.BigDecimal;

public class Result {

    BigDecimal start, stop;

    public String toJson () {
        StringBuilder sb = new StringBuilder( "{\n" );
        sb.append( "    " );  // Indent with four spaces.
        sb.append( this.enquote( "start:" ) + " " );
        sb.append( this.enquote( start.toString() ) );
        sb.append( " , \n" );
        sb.append( "    " );  // Indent with four spaces.
        sb.append( this.enquote( "stop:" ) + " " );
        sb.append( this.enquote( stop.toString() ) );
        sb.append( "\n}\n" );
        return sb.toString();
    }

    static public Result fromJson ( String json ) {
         …
    }

    private String enquote ( String string ) {
        return "\"" + string + "\"";
    }

    // Constructor
    public Result ( BigDecimal start , BigDecimal stop ) {
        this.start = start;
        this.stop = stop;
    }

    public static void main ( String[] args ) {
        Result r = new Result( new BigDecimal( "123.00" ) , new BigDecimal( "23.00" ) );
        System.out.println( r.toJson() );
    }
}

跑步时

{
    "start:" "123.00" , 
    "stop:" "23.00"
}

Consider a framework

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

© www.soinside.com 2019 - 2024. All rights reserved.