Search code examples
javajsonuimactakes

Getting output in JSON format in UIMA


I'm using Apache cTAKES where the output is required in JSON. I'm trying google's gson here,

public static void main(final String... args) throws IOException, UIMAException, SAXException {
    final String note = "Serum Cholesterol 154 150 250 mgs/dl\n-\nSerum Triglycerides 67 90 200 mgs /dl\n-\nSerum HDL: Cholesterol 38 35 55 mgs /dl\n-\nSerum LDL: Cholesterol 49 85 150 mgs/d1\n-\nSerum VLDL: Cholesterol 13 10 40 mgs/dl\n-\nTotal Cholesterol / HDL Ratio: 3.90\";
    final JCas jcas = JCasFactory.createJCas();
    jcas.setDocumentText(note);

    final AnalysisEngineDescription aed = getFastPipeline(); 
    SimplePipeline.runPipeline(jcas, aed);

    Collection<TOP> codes = JCasUtil.selectAll(jcas);
    List<TOP> list = new ArrayList<>(codes)

    TOP [] res = list.toArray(new TOP[list.size()]);
//   System.out.println(Arrays.toString(res));
    String json = new Gson().toJson(res);
    System.out.println(json);

}

This returns with the following errors,

Exception in thread "main" java.lang.IllegalArgumentException: class org.apache.uima.jcas.tcas.DocumentAnnotation_Type declares multiple JSON fields named fsGenerator
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.getBoundFields(ReflectiveTypeAdapterFactory.java:122)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory.create(ReflectiveTypeAdapterFactory.java:72)
at com.google.gson.Gson.getAdapter(Gson.java:353)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:55)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:89)
at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:195)
at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:68)
at com.google.gson.internal.bind.ArrayTypeAdapter.write(ArrayTypeAdapter.java:93)
at com.google.gson.Gson.toJson(Gson.java:586)
at com.google.gson.Gson.toJson(Gson.java:565)
at com.google.gson.Gson.toJson(Gson.java:520)
at com.google.gson.Gson.toJson(Gson.java:500)
at org.apache.ctakes.clinicalpipeline.ExtractNEs.main(ExtractNEs.java:146)

Any guidance would be of great help. Thanks


Solution

  • The answer I found for this is to use JsonCasSerializer, which has a method static void jsonSerialize(CAS aCAS, Object output) ,where one parameter is CAS document and other is a writer.

    My updated code is,

    public static void main(final String... args) throws IOException, UIMAException, SAXException {
         final String note = "Serum Cholesterol 154 150 250 mgs/dl\n-\nSerum Triglycerides 67 90 200 mgs /dl\n-\nSerum HDL: Cholesterol 38 35 55 mgs /dl\n-\nSerum LDL: Cholesterol 49 85 150 mgs/d1\n-\nSerum VLDL: Cholesterol 13 10 40 mgs/dl\n-\nTotal Cholesterol / HDL Ratio: 3.90\";
         final JCas jcas = JCasFactory.createJCas();
         jcas.setDocumentText(note);
    
         final AnalysisEngineDescription aed = getFastPipeline(); 
         SimplePipeline.runPipeline(jcas, aed);
         CAS cas = jcas.getCas();
         JsonCasSerializer jcs = new JsonCasSerializer();
         jcs.setPrettyPrint(true); // do some configuration
         StringWriter sw = new StringWriter();
         jcs.serialize(cas, sw); // serialize into sw
    
         System.out.println(sw.toString());
    

    This gave me an output of the document in JSON.

    A clear usage is given here.