Java Fasterxml对象映射器:日期解析-意外字符(';-';(代码45))

Java Fasterxml对象映射器:日期解析-意外字符(';-';(代码45)),java,json,fasterxml,Java,Json,Fasterxml,Json: {name:"abc",TxnDateUTC:2015-09-07T21:11:19Z} ObjectMapper objectMapper = new ObjectMapper(); objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES,

Json:

{name:"abc",TxnDateUTC:2015-09-07T21:11:19Z}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.readValue( jsonString, Message.class );
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): was expecting comma to separate OBJECT entries
at [Source: java.io.StringReader@1aa7ecca; line: 1, column: 113]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:599)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:301)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
Java代码:

{name:"abc",TxnDateUTC:2015-09-07T21:11:19Z}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.readValue( jsonString, Message.class );
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): was expecting comma to separate OBJECT entries
at [Source: java.io.StringReader@1aa7ecca; line: 1, column: 113]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:599)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:301)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
例外情况:

{name:"abc",TxnDateUTC:2015-09-07T21:11:19Z}
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
objectMapper.readValue( jsonString, Message.class );
Caused by: com.fasterxml.jackson.core.JsonParseException: Unexpected character ('-' (code 45)): was expecting comma to separate OBJECT entries
at [Source: java.io.StringReader@1aa7ecca; line: 1, column: 113]
at com.fasterxml.jackson.core.JsonParser._constructError(JsonParser.java:1378)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportError(ParserMinimalBase.java:599)
at com.fasterxml.jackson.core.base.ParserMinimalBase._reportUnexpectedChar(ParserMinimalBase.java:520)
at com.fasterxml.jackson.core.json.ReaderBasedJsonParser.nextToken(ReaderBasedJsonParser.java:599)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:301)
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:121)
at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:2796)
at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:1942)
我知道由于日期值是不带引号的,objectMapper会抛出异常,因为它不知道如何解析不带引号的值。但是由于我无法控制json格式,我如何解析这个json


当我在json字符串中引用日期值时,同样的代码也可以正常工作。

您可能应该阅读此代码,您的问题几乎与(阅读接受的答案)完全相同:

因此,简言之,allowunquetted的行为相当不稳定,在本例中,-字符确实会将其抛出。因此,您的json应该由以下内容变成:

{name:"abc",TxnDateUTC:2015-09-07T21:11:19Z}
为此:

{name:"abc",TxnDateUTC:"2015-09-07T21:11:19Z"}
更严格地说,应该是:

{"name":"abc","TxnDateUTC":"2015-09-07T21:11:19Z"}
编辑:此外,如果您希望我们帮助您,您应该在将来发布您的消息代码。由于您对json没有影响(这不是),因此可以编写自定义解析器

Editx2:因为我是个好人,我还为您实现了一个(相当容易出错)自定义解析器,尽管您对我的答案投了反对票。您只需这样注释消息类:

@JsonDeserialize(using = MessageDeserializer.class)
public class Message {
还有这样一个反序列化程序(我假设您可以将字符串转换为DateTime或您正在使用的任何日期,如果您不喜欢name和TXB标签都是字符串的事实,并在模式不匹配的情况下抛出一些异常,因此此处不包括此类代码):

公共类MessageDeserializer扩展JsonDeserializer{
私有最终模式名称\u Pattern=Pattern.compile(“*?(\”?)名称(\”?)[\\s]*:[\\s]*(\“*”).*?);
私有最终模式日期\u Pattern=Pattern.compile(“*?TxnDateUTC:\”?([A-Za-z0-9\\-:]{20})。*?”;
@凌驾
公共消息反序列化(JsonParser jp,反序列化上下文dc)引发IOException,JsonProcessingException{
JsonLocation currentLocation=jp.getCurrentLocation();
字符串jsonString=(字符串)currentLocation.getSourceRef();
Matcher NAME Matcher=NAME\u PATTERN.Matcher(jsonString);
字符串名称=”;
if(nameMatcher.matches()&&nameMatcher.groupCount()==3){
name=nameMatcher.group(3);
}
Matcher dateMatcher=DATE\u PATTERN.Matcher(jsonString);
字符串日期=”;
if(dateMatcher.matches()&&dateMatcher.groupCount()==1){
date=dateMatcher.group(1);
}
返回新消息(名称、日期);
}
}