Java 如何将json转换为映射<;字符串,对象>;确保整数将是整数
我有一个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
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}