gpt4 book ai didi

java - 如何使用 Jackson 的本地化小数点分隔符反序列化浮点值

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:05:33 26 4
gpt4 key购买 nike

我正在用 Jackson 解析的输入流包含纬度和经度值,例如此处:

{
"name": "product 23",
"latitude": "52,48264",
"longitude": "13,31822"
}

出于某种原因,服务器使用逗号 作为产生InvalidFormatException 的小数点分隔符。由于我无法更改服务器输出格式,因此我想教 Jackson 的 ObjectMapper 来处理这些情况。相关代码如下:

public static Object getProducts(final String inputStream) {
ObjectMapper objectMapper = new ObjectMapper();
try {
return objectMapper.readValue(inputStream,
new TypeReference<Product>() {}
);
} catch (UnrecognizedPropertyException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (JsonMappingException e) {
e.printStackTrace();
} catch (JsonParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

这是 POJO:

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {

@JsonProperty("name")
public String name;
@JsonProperty("latitude")
public float latitude;
@JsonProperty("longitude")
public float longitude;

}

我如何告诉 Jackson 这些坐标值带有德语语言环境?


我想 a custom deserializer for the specific fields as discussed here将是要走的路。我起草了这个:

public class GermanFloatDeserializer extends JsonDeserializer<Float> {

@Override
public Float deserialize(JsonParser parser, DeserializationContext context)
throws IOException {
// TODO Do some comma magic
return floatValue;
}

}

那么 POJO 看起来像这样:

import com.fasterxml.jackson.annotation.JsonProperty;

public class Product {

@JsonProperty("name")
public String name;
@JsonDeserialize(using = GermanFloatDeserializer.class, as = Float.class)
@JsonProperty("latitude")
public float latitude;
@JsonDeserialize(using = GermanFloatDeserializer.class, as = Float.class)
@JsonProperty("longitude")
public float longitude;

}

最佳答案

我想出了以下解决方案:

public class FlexibleFloatDeserializer extends JsonDeserializer<Float> {

@Override
public Float deserialize(JsonParser parser, DeserializationContext context)
throws IOException {
String floatString = parser.getText();
if (floatString.contains(",")) {
floatString = floatString.replace(",", ".");
}
return Float.valueOf(floatString);
}

}

...

public class Product {

@JsonProperty("name")
public String name;
@JsonDeserialize(using = FlexibleFloatDeserializer.class)
@JsonProperty("latitude")
public float latitude;
@JsonDeserialize(using = FlexibleFloatDeserializer.class)
@JsonProperty("longitude")
public float longitude;

}

我仍然想知道为什么当我将返回值类指定为 as = Float.class 时它不起作用,如 documentation of JsonDeserialize 中所示.它读起来好像我应该使用一个或另一个而不是两者。不管怎样,文档还声称 as = 将在定义 using = 时被忽略:

if using() is also used it has precedence (since it directly specified deserializer, whereas this would only be used to locate the deserializer) and value of this annotation property is ignored.

关于java - 如何使用 Jackson 的本地化小数点分隔符反序列化浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26725278/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com