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)
我提出了以下解决方案:
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()它具有优先权(因为它直接指定了反序列化器,而这只用于定位反序列化器),并且忽略此注释属性的值.
| 归档时间: |
|
| 查看次数: |
12102 次 |
| 最近记录: |