Java 如何将json转换为映射<;字符串,对象>;确保整数将是整数

Java 如何将json转换为映射<;字符串,对象>;确保整数将是整数,java,json,hashmap,integer,double,Java,Json,Hashmap,Integer,Double,我有一个json对象,它包含嵌套对象,值为String、Double和Integer。当我转换为Map时,它假定Integer为Double。我怎样才能改变这个 Map<String, Object> map = response.getJson(); 平均值正被正确地转换为双值,但年龄预计为整数,但在映射中被转换为双值,可以通过后处理映射,在可能的情况下将双值转换为整数,例如: static void convertIntegerToDouble(Map<String, O

我有一个json对象,它包含嵌套对象,值为
String
Double
Integer
。当我转换为
Map
时,它假定
Integer
Double
。我怎样才能改变这个

Map<String, Object> map = response.getJson();

平均值
正被正确地转换为
双值
,但年龄预计为
整数
,但在
映射
中被
转换为
双值
可以通过后处理
映射
,在可能的情况下将
双值
转换为
整数
,例如:

static void convertIntegerToDouble(Map<String, Object> map) {
    Map<String, Object> updates = new HashMap<>();
    for (Iterator<Entry<String, Object>> iter = map.entrySet().iterator(); iter.hasNext(); ) {
        Entry<String, Object> entry = iter.next();
        Object value = entry.getValue();
        if (value instanceof Map) {
            @SuppressWarnings("unchecked")
            Map<String, Object> submap = (Map<String, Object>) value;
            convertIntegerToDouble(submap);
        } else if (value instanceof Double) {
            double d = ((Double) value).doubleValue();
            int i = (int) d;
            if (d == i)
                updates.put(entry.getKey(), i);
        }
    }
    map.putAll(updates);
}

您可以通过后处理
映射
,尽可能将
双值
值转换为
整数
,例如

static void convertIntegerToDouble(Map<String, Object> map) {
    Map<String, Object> updates = new HashMap<>();
    for (Iterator<Entry<String, Object>> iter = map.entrySet().iterator(); iter.hasNext(); ) {
        Entry<String, Object> entry = iter.next();
        Object value = entry.getValue();
        if (value instanceof Map) {
            @SuppressWarnings("unchecked")
            Map<String, Object> submap = (Map<String, Object>) value;
            convertIntegerToDouble(submap);
        } else if (value instanceof Double) {
            double d = ((Double) value).doubleValue();
            int i = (int) d;
            if (d == i)
                updates.put(entry.getKey(), i);
        }
    }
    map.putAll(updates);
}

JSON不区分整数和浮点数(你不是在转换,你是在使用构建在你所使用的JSON/web/etc库上的任何转换-*它是在*进行转换。你为什么在意呢?还有,如果
average
恰好是一个整数呢?如果你仅基于该值应用泛型转换,你可能会得到一些
average
值,如下所示。)
Integer
,还有一些是
Double
。应该避免这种不一致!!这意味着您需要命名哪些应该转换。JavaScript没有整数。JSON中的所有数字都是双精度的。JSON不区分整数和浮点数(你不是在转换,你是在使用构建在你所使用的JSON/web/etc库上的任何转换-*它是在*进行转换。你为什么在意呢?还有,如果
average
恰好是一个整数呢?如果你仅基于该值应用泛型转换,你可能会得到一些
average
值,如下所示。)
Integer
,有些是
Double
。应该避免这种不一致!!这意味着您需要命名哪些应该转换。JavaScript没有整数。JSON中的所有数字都是双精度的。为什么在Double
实例测试通过后转换为
Double
?为什么不使用
Double::intVvalue
因为您使用的是
Double::doubleValue
?@DavidConrad 1)因为
value
对象
,所以必须强制转换为
Double
,以便调用
doubleValue()
.2)“在缩小原语转换后将
Double
的值作为
int
返回”,这也是此代码所做的,但是对于
if(d==i)
测试,代码也需要
double
值,因此即使
intValue()也必须调用
doubleValue()也使用了
。这样,对象上只调用了一个方法。@Andreas您的解决方案将所有的
双精度
转换为
整数
,我只需要一个
双精度
转换为
整数
逻辑为什么您认为它会将所有的
双精度
转换为
整数
?测试代码是指定的逻辑上写的,以表明它没有被转换,正如在输出中可以看到的那样,
42.0
(double)被转换为
42
(int),但是
3.14
(double)没有被转换,因为它不能在不丢失值的情况下被转换,这是
if(d==i)
检查代码的整个点。@Logic“我只需要转换一个
Double
"如果你费心回答你的问题,也许你会得到一个更好的解决方案,只改变一个特定命名属性的值。--但是,如果这个解决方案像获取一个特定命名属性的值并转换它的类型一样简单,那么你真的需要得到这样简单的代码吗你自己。为什么要在Double
测试通过后转换为
Double
呢?为什么不使用
Double::intValue
,因为你使用的是
Double::doubleValue
?@DavidConrad 1)因为
value
是一个
对象,所以必须转换为
Double
,才能调用
doubleValue()
.2)“在缩小原语转换后,将
Double
的值作为
int
返回”,这也是此代码所做的,但是对于
if(d==i)
测试,代码也需要
Double
值,因此即使使用了
intValue()
,也必须调用
doubleValue()
。这样,对象上只调用了一个方法。@Andreas您的解决方案将所有
双精度
转换为
整数
,我只需要一个
双精度
转换为
整数
@逻辑为什么您认为它会将所有
双精度
转换为
整数
?编写测试代码是为了表明它没有转换,正如在输出中可以看到的那样,其中
42.0
(double)被转换为
42
(int),但是
3.14
(double)没有被转换,因为它不能在不损失值的情况下被转换,这是
if(d==i)的整个点
签入代码。@Logic“我只需要一个
Double
就可以转换”如果您费心回答您的问题,也许您会得到一个更好的解决方案,只更改特定命名属性的值。--但是,同样,如果解决方案非常简单,比如获取一个特定命名属性的值并转换其类型,那么您真的需要得到这样简单的代码吗?你自己做吧。
Map<String, Object> map = new HashMap<>(Map.of(
        "A", 42.0,
        "B", new HashMap<>(Map.of(
                "K", 42.0,
                "L", new HashMap<>(Map.of(
                        "R", 42.0,
                        "S", 3.14
                )),
                "M", 3.14
        )),
        "C", 3.14,
        "D", "Foo"
));
System.out.println(map);
convertIntegerToDouble(map);
System.out.println(map);
{A=42.0, B={K=42.0, L={R=42.0, S=3.14}, M=3.14}, C=3.14, D=Foo}
{A=42, B={K=42, L={R=42, S=3.14}, M=3.14}, C=3.14, D=Foo}