Java 大十进制低值
我在mysql数据库中存储了非常低的值,类似于:Java 大十进制低值,java,mysql,spring,spring-boot,spring-data,Java,Mysql,Spring,Spring Boot,Spring Data,我在mysql数据库中存储了非常低的值,类似于: 0.00000070 0.00000097 我使用spring boot将这些值作为rest api提供,我的模型映射如下: public class Account extends BaseEntity { @Column(name = "VALUATION", precision = 15, scale = 8) @JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.
0.00000070
0.00000097
我使用spring boot将这些值作为rest api提供,我的模型映射如下:
public class Account extends BaseEntity {
@Column(name = "VALUATION", precision = 15, scale = 8)
@JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class })
@Setter @Getter
private BigDecimal valuation;
// others fields
{
"valuation": 9.7e-7
}
@JsonComponent
public class LowValueDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
System.out.println(parser.getDecimalValue());
return parser.getDecimalValue().toPlainString();
}
}
在数据库中,它被正确地存储,就像我显示的那样,但要显示,它的显示方式如下:
public class Account extends BaseEntity {
@Column(name = "VALUATION", precision = 15, scale = 8)
@JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class })
@Setter @Getter
private BigDecimal valuation;
// others fields
{
"valuation": 9.7e-7
}
@JsonComponent
public class LowValueDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
System.out.println(parser.getDecimalValue());
return parser.getDecimalValue().toPlainString();
}
}
有没有一种方式可以像存储一样显示
谢谢
----编辑
把我的模型改成这个
@Column(name = "VALUATION", precision = 15, scale = 8)
@JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class })
@JsonDeserialize(using = LowValueDeserializer.class)
@Setter @Getter
private BigDecimal valuation;
我的自定义反序列化程序如下所示:
public class Account extends BaseEntity {
@Column(name = "VALUATION", precision = 15, scale = 8)
@JsonView({ ViewsUtil.Ticker.class, ViewsUtil.Chart.class })
@Setter @Getter
private BigDecimal valuation;
// others fields
{
"valuation": 9.7e-7
}
@JsonComponent
public class LowValueDeserializer extends JsonDeserializer<String> {
@Override
public String deserialize(JsonParser parser, DeserializationContext context) throws IOException, JsonProcessingException {
System.out.println(parser.getDecimalValue());
return parser.getDecimalValue().toPlainString();
}
}
@JsonComponent
公共类LowValueDeserializer扩展JsonDeserializer{
@凌驾
公共字符串反序列化(JsonParser解析器,反序列化上下文)引发IOException,JsonProcessingException{
System.out.println(parser.getDecimalValue());
返回parser.getDecimalValue().toPlainString();
}
}
从未调用system out,结果仍然相同。更新:
正如JB Nizet在评论中所说,您必须使用:
将_BIGDECIMAL _写为_PLAIN
由于Jackson 2.2在特定于数据类型的序列化下以及在默认值下设置为false
时,可以使用将BIGDECIMAL>写入为普通
您可以使用ObjectMapper
中的enable()
方法将其设置为true
,如下所示:
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN);
String theWholeNumber = YourBigDecimalNumber.toPlainString();
在将BigDecimal转换为字符串时,必须使用.toPlainString()
方法,如下所示:
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN);
String theWholeNumber = YourBigDecimalNumber.toPlainString();
我认为您的问题是,该值在您的JSON字符串中以指数显示。我认为这不是问题,因为您在客户端和服务器端使用相同的模型(希望如此)。如果要使用它,则无需更改格式。仅当您想显示它时,需要使用.toPlainString()
方法将其转换为字符串。更新:
正如JB Nizet在评论中所说,您必须使用:
将_BIGDECIMAL _写为_PLAIN
由于Jackson 2.2在特定于数据类型的序列化下以及在默认值下设置为false
时,可以使用将BIGDECIMAL>写入为普通
您可以使用ObjectMapper
中的enable()
方法将其设置为true
,如下所示:
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN);
String theWholeNumber = YourBigDecimalNumber.toPlainString();
在将BigDecimal转换为字符串时,必须使用.toPlainString()
方法,如下所示:
ObjectMapper mapper = new ObjectMapper().enable(SerializationFeature.WRITE_BIGDECIMAL_AS_PLAIN);
String theWholeNumber = YourBigDecimalNumber.toPlainString();
我认为您的问题是,该值在您的JSON字符串中以指数显示。我认为这不是问题,因为您在客户端和服务器端使用相同的模型(希望如此)。如果要使用它,则无需更改格式。仅当您想显示它时,您需要使用.toPlainString()
方法将其转换为字符串。请参阅:查找WRITE\u bigdecim\u如果您想格式化bigdecim进行显示。即使您想要的格式与复制文章中使用的格式不同,这也是一个副本。@DwB在重复文章中使用String.format()
是否有任何好处?应该更好地了解OP想要什么阅读我关于如何解决这个“问题”的第一条评论。关于上一次编辑:使用自定义反序列化程序(应该将JSON值转换为BigDecimal)无法解决JSON序列化问题(BigDecimal如何序列化为JSON值)。@JBNizet使用了您的建议,工作起来很有魅力!谢谢你看:寻找WRITE_BIGDECIMAL_,因为你想格式化BIGDECIMAL以供显示。即使您想要的格式与复制文章中使用的格式不同,这也是一个副本。@DwB在重复文章中使用String.format()
是否有任何好处?应该更好地了解OP想要什么阅读我关于如何解决这个“问题”的第一条评论。关于上一次编辑:使用自定义反序列化程序(应该将JSON值转换为BigDecimal)无法解决JSON序列化问题(BigDecimal如何序列化为JSON值)。@JBNizet使用了您的建议,工作起来很有魅力!谢谢你是的,我尝试过这个,使用@JsonDeserialize,但是这个方法从未被调用编辑我的帖子并添加我说的代码。我尝试过这个,使用@JsonDeserialize,但是这个方法从未被调用编辑我的帖子并添加我说的代码