2013-10-17 171 views
6

当我使用Apache提卡确定从内容的文件类型。 XML文件很好,但不是JSON。如果内容类型是json,它将返回“text/plain”而不是“application/json”。阿帕奇提卡和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(); 
     } 
    } 
} 

回答

5

JSON是基于纯文本的,所以当仅给出与字节一起使用时,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的答案,因为你期待

+0

如果您没有处理文件,或者不能相信文件扩展名为提示,任何人都有建议吗? – milletron

+0

@milletron通阿帕奇蒂卡文件的内容,它会做基于MIME魔力检测过 – Gagravarr

+0

感谢@Gagravarr。是的,我可以通过十几个不同的字节流来推测整个MIME检测工作,但仍然不会将JSON与纯文本区分开来(至少为1.15)。我想有人会写一个类似于XML和HTML的新探测器?我只是感到惊讶JSON不包括已经。 – milletron

0

对于那些不处理文件,我发现最简单的方法是通过杰克逊运行有效载荷看看它是否可以被解析。如果杰克逊可以解析它,你知道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; 
}