- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我已启用 jackson-datatype-joda,但它无法与 JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS
一起使用。
我已经按如下方式设置了 ObjectMapper:
ObjectMapper jacksonObjectMapper = new ObjectMapper();
jacksonObjectMapper.configure(JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS, true);
jacksonObjectMapper.registerModule(new JodaModule());
反序列化时(使用 com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer),我最终遇到错误:
org.springframework.http.converter.HttpMessageNotReadableException: Could not read JSON: Current token (VALUE_STRING) not numeric, can not use numeric value accessors
at [...]; nested exception is com.fasterxml.jackson.databind.JsonMappingException: Current token (VALUE_STRING) not numeric, can not use numeric value accessors
我调试了 LocalDateDeserializer 并发现它期望 VALUE_NUMBER_INT - 而 JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS
使日期具有字符串。
当我关闭该功能时,一切正常。
此功能(或类似功能)是否有可能与 Joda Time 一起使用?
最佳答案
Joda
模块使用 com.fasterxml.jackson.datatype.joda.deser.LocalDateDeserializer
用于反序列化 org.joda.time.LocalDate
对象。这个类看起来像这样:
@Override
public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt)
throws IOException, JsonProcessingException
{
// [yyyy,mm,dd]
if (jp.isExpectedStartArrayToken()) {
jp.nextToken(); // VALUE_NUMBER_INT
int year = jp.getIntValue();
jp.nextToken(); // VALUE_NUMBER_INT
int month = jp.getIntValue();
jp.nextToken(); // VALUE_NUMBER_INT
int day = jp.getIntValue();
if (jp.nextToken() != JsonToken.END_ARRAY) {
throw ctxt.wrongTokenException(jp, JsonToken.END_ARRAY, "after LocalDate ints");
}
return new LocalDate(year, month, day);
}
switch (jp.getCurrentToken()) {
case VALUE_NUMBER_INT:
return new LocalDate(jp.getLongValue());
case VALUE_STRING:
String str = jp.getText().trim();
if (str.length() == 0) { // [JACKSON-360]
return null;
}
return parser.parseLocalDate(str);
default:
}
throw ctxt.wrongTokenException(jp, JsonToken.START_ARRAY, "expected JSON Array, String or Number");
}
如您所见,如果 LocalDate
是数组,则此反序列化器需要此数组中的整数。您可以编写自定义反序列化器并扩展此实现。请参见以下示例:
class LocalDateWithStringsDeserializer extends LocalDateDeserializer {
private static final long serialVersionUID = 1L;
@Override
public LocalDate deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException,
JsonProcessingException {
// [yyyy,mm,dd] or ["yyyy","mm","dd"]
if (jp.isExpectedStartArrayToken()) {
return parseArray(jp, ctxt);
}
return super.deserialize(jp, ctxt);
}
private LocalDate parseArray(JsonParser jp, DeserializationContext ctxt)
throws JsonParseException, IOException {
int year = getNextValue(jp);
int month = getNextValue(jp);
int day = getNextValue(jp);
if (jp.nextToken() != JsonToken.END_ARRAY) {
throw ctxt.wrongTokenException(jp, JsonToken.END_ARRAY, "after LocalDate ints");
}
return new LocalDate(year, month, day);
}
private int getNextValue(JsonParser jp) throws IOException, JsonParseException {
jp.nextToken();
return new Integer(jp.getText());
}
}
现在您可以链接上面的反序列化器和您的属性:
@JsonDeserialize(using = LocalDateWithStringsDeserializer.class)
private LocalDate date;
关于java - 如何从 JSON 反序列化为 LocalDate,同时还使用 JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24432828/
我有一个可以使用 JsonGenerator 将产品对象写入文件的方法。(产品转JSON) 我想使用第二种方法使用 JsonGenerator 流将 HashSet 中的所有产品写入 JSON 文件。
给出的是一个 JSON 数组 [ { "ref": "idValue", "data": { "filter": [
我正在从套接字读取字节,然后使用 jsonGenerator 写入 json 文件。问题是每次从套接字接收到流时,JsonGenerator 都会覆盖该文件。如何让它附加后续流而不是覆盖? JsonF
我想输出以下 JSON: result: { "x": 11, "y": 10, "actions": [ ], "localConfigurations":
我正在编写一个应用程序来接受来自 Json 文件的输入并对其进行排序。我有一个函数,它接受 JsonObjects 的排序 ArrayList 并将它们写入临时文件(以便稍后在外部合并排序中使用)。我
我目前有一个项目使用 jackson faster xml 通过自定义序列化器和反序列化器将 POJO 序列化/反序列化为 Json。据我了解,ObjectMapper 一旦创建和配置后就是线程安全的
我正在使用 Jackson 的 JsonGenerator 生成 JSON,并且希望从文本 JSON 字符串插入子对象。 gen.writeStartObject(); gen.writeString
我已经有使用 JsonGenerator 编写 JSON 的工作流程。现在我需要将此数据传递给另一个需要 POJO 作为输入并生成 JSON 的进程。当然,我想避免构建另一个已序列化为 JSON 的数
假设我想创建 JSON 并使用 Java JSON Streaming API 将其存储在字符串中。为此,我在其上创建了 ByteArrayOutputStream (BAOS) 和 JsonGene
我想使用 Jackson API (JsonFactory,JsonGenerator) 生成以下结构的 JSON 字符串。我该怎么做? 预期: { "api": { "Sal
我正在使用此方法将任何对象转换为 json 字符串: private String objectToJson(Object object) throws IOException { /
我需要从 Servlet 输出 JSONP。我正在使用 javax.json 的 JsonStreamer 将 JSON 输出到输出流。为了生成 JSONP,我需要用回调函数名称和形成回调调用表达式所
我已启用 jackson-datatype-joda,但它无法与 JsonGenerator.Feature.WRITE_NUMBERS_AS_STRINGS 一起使用。 我已经按如下方式设置了 Ob
在这里,我在我的 eclipse 项目中使用 Jackson data binder 2.4.1 jar 库将对象转换为 json 格式。这是我的代码: ObjectMapper mapper = n
在这里,我在 Eclipse 项目中使用 Jackson Data Binder 2.4.1 jar 库将对象转换为 json 格式。这是我的代码: ObjectMapper mapper = new
我正在开发一个 Spring-MVC 应用程序,从早上开始,当我调用一个特定的 Controller 方法时,我收到了与 Jackson 相关的错误。由于没有具体指出错误所在的行,因此我查找并发现这是
我是一名优秀的程序员,十分优秀!