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

JJD*_*JJD 6 java formatexception jackson decimalformat json-deserialization

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

{
    "name": "product 23",
    "latitude": "52,48264",
    "longitude": "13,31822"
}
Run Code Online (Sandbox Code Playgroud)

由于某种原因,服务器使用逗号作为产生的小数分隔符InvalidFormatException.由于我无法改变服务器输出格式,我想教杰克逊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;
}
Run Code Online (Sandbox Code Playgroud)

这是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;

}
Run Code Online (Sandbox Code Playgroud)

我如何告诉Jackson这些坐标值是否带有德语区域设置?


我想这里讨论的特定字段的自定义反序列化器将是要走的路.我起草了这个:

public class GermanFloatDeserializer extends JsonDeserializer<Float> {

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

}
Run Code Online (Sandbox Code Playgroud)

然后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;

}
Run Code Online (Sandbox Code Playgroud)

JJD*_*JJD 6

我提出了以下解决方案:

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);
    }

}
Run Code Online (Sandbox Code Playgroud)

...

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;

}
Run Code Online (Sandbox Code Playgroud)

不过我不知道为什么我它不工作的时候我指定的返回值作为类as = Float.class如能在中找到的文件JsonDeserialize.它看起来好像我应该使用其中一个而不是两个.无论如何,文档还声称as =在using =定义时将被忽略:

如果也使用using()它具有优先权(因为它直接指定了反序列化器,而这只用于定位反序列化器),并且忽略此注释属性的值.