Apache Tika和Json

6
当我使用Apache Tika从内容中确定文件类型时,XML文件是可以的,但JSON不行。如果内容类型为JSON,则会返回"text/plain"而不是"application/json"。
需要帮助吗?
public static String tiKaDetectMimeType(final File file) throws IOException {
    TikaInputStream tikaIS = null;
    try {
        tikaIS = TikaInputStream.get(file);
        final Metadata metadata = new Metadata();
        return DETECTOR.detect(tikaIS, metadata).toString();
    } finally {
        if (tikaIS != null) {
            tikaIS.close();
        }
    }
}
2个回答

7

JSON基于纯文本,因此当Tika只有字节工作时,将其报告为纯文本并不完全令人惊讶。

问题在于您没有提供文件名,因此Tika没有文件名可用。如果您提供了文件名,Tika可以说bytes = plain text + filename = json => json并给您预期的答案。

您缺少的行是:

metadata.set(Metadata.RESOURCE_NAME_KEY, filename);

因此,固定的代码片段将会是:
tikaIS = TikaInputStream.get(file);
final Metadata metadata = new Metadata();
metadata.set(Metadata.RESOURCE_NAME_KEY, file.getName());
return DETECTOR.detect(tikaIS, metadata).toString();

这样,您将会收到一个 JSON 的答案,就像您所期望的那样。


如果你没有处理文件,或者不能信任文件扩展名作为提示,你有什么建议吗? - milletron
@milletron 把文件的内容传递给 Apache Tika,它会基于 MIME 类型进行魔术检测。 - Gagravarr
感谢@Gagravarr。是的,我可以告诉你,我通过的十几个不同的字节流整体上都可以检测到mime,但仍然无法将Json与纯文本分开(至少在1.15版本中)。我猜想,我们需要编写一个类似于XML和HTML的新探测器?我只是惊讶JSON还没有被包含进来。 - milletron
@milletron JSON格式一开始并没有什么特别的标志,只需查找{"[",但这并不是唯一的方法,有时候很复杂... - Gagravarr

0
对于那些不涉及文件处理的情况,我发现最简单的方法就是通过Jackson运行有效载荷以查看它是否可以被解析。如果Jackson可以解析它,你就知道:1)你正在使用JSON格式;2)JSON格式是有效的。
private static final ObjectMapper MAPPER = new ObjectMapper();
public static boolean isValidJSON(final String json) {
    boolean valid = true;
    try {
        MAPPER.readTree(json);
    } catch (IOException e) {
        valid = false;
    }
    return valid;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接