我有一个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;
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::toString
和new 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"
}
提示:您可能需要考虑使用JSON↔Java映射框架来帮助您完成这项工作。