杰克逊解析器反斜杠双引号不起作用

时间:2014-05-03 14:24:08

标签: json jackson backslash

当我尝试将json转换为map时,我遇到了一个问题。

我使用jakson,这是我的mapper():

        mapper = new ObjectMapper();
        mapper.setTimeZone(TimeFormat.getDefaultTimeZone());
        mapper.configure(com.fasterxml.jackson.databind.MapperFeature.REQUIRE_SETTERS_FOR_GETTERS, false);
        mapper.configure(com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.setSerializationInclusion(com.fasterxml.jackson.annotation.JsonInclude.Include.NON_NULL);
        mapper.configure(Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
        DateFormat format = new SimpleDateFormat("yyyyMMddHHmmss");
        format.setTimeZone(TimeFormat.getDefaultTimeZone());
        mapper.setDateFormat(format);

这是“坏”' JSON:

{..."id":660273193,"orderId":220575205,"orderItemAmount":5.6,"orderItemNum":2,"orderItemPrice":2.8,"productCName":"16\\" Shoes","productId":23373137,...

错误信息是:意外字符(' S'(代码22609 / 0x5851)):期待逗号分隔OBJECT条目 用户设置16" 10作为productName,但无法将其从json转换为map。 我尝试过Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER但不起作用。 在这种情况下,我找不到任何配置吗?

1 个答案:

答案 0 :(得分:2)

如果从外部源读取,则应该使用一个反斜杠来转义引用;如果从Java常量读取JSON字符串,则应使用三个反斜杠。这是一个例子:

public class JacksonBackslash {

    public static void main(String[] args) throws IOException {
        ObjectMapper mapper = new ObjectMapper();
       // mapper.configure(JsonParser.Feature.ALLOW_BACKSLASH_ESCAPING_ANY_CHARACTER, true);
        String json = "{\"productCName\":\"16\\\" Shoes\"}";
        System.out.println(json);
        System.out.println(mapper.readValue(json, new TypeReference<Map<String, Object>>() {}));
    }
}

输出:

{"productCName":"16\" Shoes"}
{productCName=16" Shoes}