2013-10-17 8 views
6

Quando uso Apache Tika per determinare il tipo di file dal contenuto. Il file XML va bene, ma non il json. Se il tipo di contenuto è json, restituirà "text/plain" invece di "application/json".Apache Tika e Json

Qualsiasi aiuto?

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(); 
     } 
    } 
} 

risposta

5

JSON è basato su testo semplice, quindi non è del tutto sorprendente che Tika segnalato come tale quando somministrato solo il byte da lavorare.

Il tuo problema è che non hai fornito anche il nome del file, quindi Tika non aveva quello con cui lavorare. Se tu avessi, Tika potrebbe aver detto bytes=plain text + filename=json => json e dato la risposta che vi aspettavate

La linea che ti manca è:

metadata.set(Metadata.RESOURCE_NAME_KEY, filename); 

Quindi il frammento di codice fisso sarebbe:

tikaIS = TikaInputStream.get(file); 
final Metadata metadata = new Metadata(); 
metadata.set(Metadata.RESOURCE_NAME_KEY, file.getName()); 
return DETECTOR.detect(tikaIS, metadata).toString(); 

Con ciò, riceverai una risposta di JSON come ti aspettavi

+0

Chiunque ha suggerimenti se non si ha a che fare con un file o non ci si può fidare dell'estensione del file come suggerimento? – milletron

+0

@milletron Passa ad Apache Tika il contenuto del file, e farà anche il rilevamento basato sulla magia del mimo – Gagravarr

+0

Grazie a @Gagravarr. Sì, posso dire che la funzione di rilevamento mime funziona in generale con una dozzina di flussi di byte diversi che ho trasmesso, ma ancora non distinguo Json separatamente dal testo normale (sebbene con almeno 1.15). Immagino che si dovrebbe scrivere un nuovo rilevatore simile a XML e HTML? Sono solo sorpreso che JSON non sia già incluso. – milletron

0

Per coloro che non hanno a che fare con un file, ho trovato più semplice eseguire il payload tramite Jackson per vedere se può essere analizzato o meno. Se Jackson può analizzarlo, sai 1) stai lavorando con JSON e 2) il JSON è valido.

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; 
}