【发布时间】:2014-12-30 18:15:26
【问题描述】:
我用Jackson 解析的输入流包含纬度和经度值,如下所示:
{
"name": "product 23",
"latitude": "52,48264",
"longitude": "13,31822"
}
由于某种原因,服务器使用 逗号 作为小数点分隔符,生成 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;
}
这是 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;
}
我如何告诉杰克逊这些坐标值来自德国语言环境?
我想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;
}
【问题讨论】:
-
您拥有的是无效的 JSON。让提供 JSON 的人为您提供合法的资料。
-
@HotLicks 是否因为
,作为小数点分隔符而无效?如果您指的是尾随逗号 - 这是我忘记输入的内容。我已修复它。 -
逗号小数点不是有效的 JSON。您可以访问 json.org 并查看语法。逗号的出现可能是因为您对服务器的请求以某种方式暗示了语言环境,并且更改该隐含语言环境将解决问题,但否则另一端的人应该修复它。
-
jslint.com 说它是有效的。但是,服务器端不在我的控制之下。
-
好吧,我想它是有效的,因为这些是字符串,而不是数字。您可以根据需要处理字符串。本身与 JSON 无关。将
public float latitude;更改为public String latitude;等
标签: java jackson json-deserialization decimalformat formatexception