【问题标题】:Return BigDecimal fields as JSON String values in Java在 Java 中将 BigDecimal 字段作为 JSON 字符串值返回
【发布时间】:2018-09-03 12:11:44
【问题描述】:

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

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

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;

【问题讨论】:

  • 你在使用一些库进行 json 序列化/反序列化吗?
  • 你不能创建一个自定义序列化程序来将 BigDecimal 值转换为字符串,同时返回 json 输出吗?
  • 不,不使用任何库。
  • @Ankur:问题来了,我该怎么做?
  • 你能帮忙补充一下你是如何序列化result对象的吗?

标签: java json rest get bigdecimal


【解决方案1】:

你可以使用@JsonFormat注解如下:

import com.fasterxml.jackson.annotation.JsonFormat;

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

   // getters and setters
}

【讨论】:

    【解决方案2】:

    使用String

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

    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 并且数组无法解释。

    基本上,您应该在 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 映射框架来帮助您完成这项工作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-10-23
      • 1970-01-01
      • 1970-01-01
      • 2018-11-29
      • 2013-10-01
      • 1970-01-01
      • 2022-06-10
      相关资源
      最近更新 更多