From 401bf785dd2d21efa45001cb5db7867291b6b9cf Mon Sep 17 00:00:00 2001 From: xiaozhuangshi Date: Sat, 10 Oct 2020 10:48:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DJSONUtil.toBean=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E4=B8=A2=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/cn/hutool/json/InternalJSONUtil.java | 6 +- .../java/cn/hutool/json/JSONUtilTest.java | 69 +++++++++++++++++++ 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java index 23963173a..8bc0e6d27 100644 --- a/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java +++ b/hutool-json/src/main/java/cn/hutool/json/InternalJSONUtil.java @@ -9,6 +9,7 @@ import cn.hutool.core.util.StrUtil; import java.io.IOException; import java.io.Writer; +import java.math.BigDecimal; import java.time.temporal.TemporalAccessor; import java.util.Calendar; import java.util.Collection; @@ -158,10 +159,7 @@ final class InternalJSONUtil { if ((b >= '0' && b <= '9') || b == '-') { try { if (string.indexOf('.') > -1 || string.indexOf('e') > -1 || string.indexOf('E') > -1) { - double d = Double.parseDouble(string); - if (false == Double.isInfinite(d) && false == Double.isNaN(d)) { - return d; - } + return new BigDecimal(string); } else { Long myLong = new Long(string); if (string.equals(myLong.toString())) { diff --git a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java index 1b1e2c28f..fba18df9d 100644 --- a/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java +++ b/hutool-json/src/test/java/cn/hutool/json/JSONUtilTest.java @@ -10,8 +10,10 @@ import cn.hutool.json.test.bean.UserC; import org.junit.Assert; import org.junit.Test; +import java.math.BigDecimal; import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; public class JSONUtilTest { @@ -124,6 +126,15 @@ public class JSONUtilTest { // Assert.assertEquals("{\"age\":18,\"gender\":\"男\"}", user.getProp()); } + @Test + public void toBeanTest3() { + // 测试数字类型精度丢失的情况 + String number = "1234.123456789123456"; + String jsonString = "{\"create\":{\"details\":[{\"price\":" + number + "}]}}"; + WebCreate create = JSONUtil.toBean(jsonString, WebCreate.class); + Assert.assertEquals(number,create.getCreate().getDetails().get(0).getPrice().toString()); + } + @Test public void putByPathTest() { JSONObject json = new JSONObject(); @@ -161,4 +172,62 @@ public class JSONUtilTest { final JSONObject jsonObject = JSONUtil.parseObj(json); Assert.assertEquals("12.00", jsonObject.getBigDecimal("test").setScale(2).toString()); } + + + class WebCreate { + private Create create; + @Override + public String toString() { + return "WebCreate{" + + "create=" + create + + '}'; + } + + public void setCreate(Create create) { + this.create = create; + } + + public Create getCreate() { + return create; + } + } + + class Create { + @Override + public String toString() { + return "Create{" + + "details=" + details + + '}'; + } + + private List details; + + public void setDetails(List details) { + this.details = details; + } + + public List getDetails() { + return details; + } + } + + class Detail { + private BigDecimal price; + + public void setPrice(BigDecimal price) { + this.price = price; + } + + @Override + public String toString() { + return "Detail{" + + "price=" + price + + '}'; + } + + public BigDecimal getPrice() { + return price; + } + } } +