Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/346.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中以JSON字符串值的形式返回BigDecimal字段_Java_Json_Rest_Get_Bigdecimal - Fatal编程技术网

在Java中以JSON字符串值的形式返回BigDecimal字段

在Java中以JSON字符串值的形式返回BigDecimal字段,java,json,rest,get,bigdecimal,Java,Json,Rest,Get,Bigdecimal,我有一个getapi,它返回一个JSON。预期的格式为: { "value1": "123.00", "value2": "23.00" } 这些值是对象中的BigDecimal: public class Result{ BigDecimal value1; BigDecimal value2; // getters and setters } 现在,当发出请求时,我创建Result对象,并将这些值填充为BigDecimal,创建一个列表并返回。我收到的

我有一个
getapi
,它返回一个
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字段的对象,我无法向它填充字符串值

最后,以下是列表的编制方式:

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;
List obj=Arrays.stream(myObj.collect)(Collectors.toList());
结果=新结果();
对象forEach(t->t.mergeToResult(result));//mergeToResults执行所有类似于填充的结果。setValue1(新的BigDecimal(123.00))
返回结果;
使用
字符串
根据JavaScript的传统行为,JSON中的
Number
类型很可能被视为一个数字。浮点技术为了提高执行速度而故意牺牲精度

该类的目的正好相反,即为了准确性而牺牲执行速度

因此,如果您希望最好地保留
BigDecimal
值,请将其存储为
字符串。希望这种方法能够减少JSON的使用者不经意间将传入值解析为浮点值的可能性。向那些使用JSON的人清楚地说明您希望将数据解析为
BigDecimal
或等效值而不是浮点值

Java导出:

String输出=myBigDecimal.toString();
JSON:

{
“值1”:“123.00”,
“值2”:“23.00”
}
Java导入:

BigDecimal bd=新的BigDecimal(“123.00”);
学习和的文档。您还应该了解该方法

溪流 至于您的Java流,我不理解您的问题。您使用的
列表
和数组无法解释

基本上,您应该在
Result
类上实现
toJson
方法。在流代码中调用
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映射框架来帮助您完成这项工作。

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

import com.fasterxml.jackson.annotation.JsonFormat;

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

   // getters and setters
}

您是否正在使用某个库进行json序列化/反序列化?在返回json输出时,是否可以创建自定义序列化程序将BigDecimal值转换为字符串?否,不使用任何库。@Ankur:这就是问题所在,我应该如何做?您能帮助添加序列化
结果
对象的方式吗?