Возвращать поля BigDecimal в виде строковых значений JSON в Java - PullRequest
0 голосов
/ 03 сентября 2018

У меня есть 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;

1 Ответ

0 голосов
/ 04 сентября 2018

Использование String

Тип Number в JSON, скорее всего, будет рассматриваться как число с плавающей точкой , из моего прочтения страницы Википедии , согласно традиционному поведению JavaScript. Технология с плавающей точкой преднамеренно жертвует точностью ради скорости исполнения.

Класс 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.

Streams

Что касается ваших потоков 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"
}

Рассмотрим рамки

Совет. Возможно, вы захотите использовать среду отображения JSONppingJava, чтобы помочь вам в этой работе.

...