使用ObjectMapper转换合法UUID字符串报错的原因及解决方法
你碰到的这个JsonParseException本质原因其实很直白:Jackson的ObjectMapper默认是用来解析JSON格式数据的,但你直接传入的UUID字符串7a041f81-1214-41e5-bb58-9a46b2ca08d4并不是合法的JSON值。
按照JSON规范,字符串类型必须用双引号包裹,比如"7a041f81-1214-41e5-bb58-9a46b2ca08d4"才是符合要求的JSON字符串。你直接传不带引号的内容时,Jackson会从第一个字符开始按JSON语法解析,当它读到第二个字符a的时候,发现这不符合JSON根级值的语法规则(JSON根级值只能是对象、数组、带引号的字符串、数字、布尔值或null),所以抛出了这个“意外字符”的错误。
这里有几种实用的解决思路,你可以根据自己的场景选择:
方法1:让输入符合JSON格式
把你的UUID字符串用双引号包裹,变成合法的JSON字符串再传给readValue,注意Java里双引号需要用反斜杠转义:
UUID uuid = mapper.readValue("\"7a041f81-1214-41e5-bb58-9a46b2ca08d4\"", UUID.class);
方法2:直接使用UUID类的原生解析方法(更推荐)
其实你完全没必要借助ObjectMapper来解析UUID字符串,Java自带的java.util.UUID类本身就有fromString()静态方法,专门用来解析标准格式的UUID字符串:
UUID uuid = UUID.fromString("7a041f81-1214-41e5-bb58-9a46b2ca08d4");
这种方法更直接高效,还能避免Jackson解析JSON带来的额外限制,是处理这类场景的最优解。
方法3:配置ObjectMapper支持无引号的字符串(不推荐)
如果你因为某些特殊原因必须用ObjectMapper处理无引号的字符串,可以通过配置开启非标准JSON解析支持:
ObjectMapper mapper = new ObjectMapper(); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true); mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_STRINGS, true); UUID uuid = mapper.readValue("7a041f81-1214-41e5-bb58-9a46b2ca08d4", UUID.class);
不过这种配置会让Jackson接受非标准的JSON格式,可能带来其他潜在的兼容性问题,除非必要否则不建议使用。
内容的提问来源于stack exchange,提问作者user11311618

