-1

I'm trying to parse a very long JSON like this.

{
  "BlastOutput2": [
    {
      "report": {
        "program": "blastn",
        "version": "BLASTN 2.6.0+",
        "reference": "Stephen F. Altschul, Thomas L. Madden, Alejandro A. Schäffer, Jinghui Zhang, Zheng Zhang, Webb Miller, and David J. Lipman (1997), \"Gapped BLAST and PSI-BLAST: a new generation of protein database search programs\", Nucleic Acids Res. 25:3389-3402.",
        "search_target": {
          "subjects": [
            "Subject_1"
          ]
        },
        "params": {
          "expect": 0.0001,
          "sc_match": 1,
          "sc_mismatch": -2,
          "gap_open": 5,
          "gap_extend": 2,
          "filter": "F"
        },
        "results": {
          "bl2seq": [
            {
              "query_id": "Query_1",
              "query_title": "F1-125",
              "query_len": 806,
              "hits": [
                {
                  "num": 1,
                  "description": [
                    {
                      "id": "gi|251831106|ref|NC_012920.1|",
                      "title": "gi|251831106|ref|NC_012920.1| Homo sapiens mitochondrion, complete genome"
                    }
                  ],
                  "len": 16569,
                  "hsps": [
                    {
                      "num": 1,
                      "bit_score": 619.793,
                      "score": 322,
                      "evalue": 3.47859e-180,
                      "identity": 458,
                      "query_from": 57,
                      "query_to": 572,
                      "query_strand": "Plus",
                      "hit_from": 16060,
                      "hit_to": 16569,
                      "hit_strand": "Plus",
                      "align_len": 516,
                      "gaps": 6,
                      "qseq": "GTATTGACTCACCGCTTAACAACGGCAATGTATTTCGTACATTACTGCCAGCCACAAAGAAAGTTGTACAGTACCATAAATACTTGACTACCTGTAGTACATAAAAACTCAACCCACATCAAAACCCCAAAAGACGAGACAGAAAAGCAAGTTTTTCAATCAACCTTCAACTGTCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATATCAACAAACCTACCCGCCCTTAACAGTACATAGCACATAAAGTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTTTTTTTTGTGGTCCCCTGACCACCATCCTCCGTGTTTTTTTTTTTTCTCGCACAAGAGTGCTACTCTCCTCGTTCTGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAGCCTAAATAGCCCACACGTTCCCCTTTTTATAAGACATCACGATG",
                      "hseq": "GTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAATACTTGACCACCTGTAGTACATAAAAACCCAATCCACATCAAAACCCCCTCC--CCATGCTTACAAGCAAGTACAGCAATCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGG-GGTCCCTTGACCACCATCCTCCGTG--AAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAGCCTAAATAGCCCACACGTTCCCC-TTAAATAAGACATCACGATG",
                      "midline": "|||||||||||||  | |||||| || |||||||||||||||||||||||||||| | |||  |||||| |||||||||||||||||| ||||||||||||||||||| ||| |||||||||||||||      | |  |  | ||||||||    ||||||||| |||||| ||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||| ||||||||||||||||| |||||||| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||    |  | |||||| ||||||||||||||||||     |   | || |||||||||||||||||||||||| || ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| ||  ||||||||||||||||"
                    },
                    {
                      "num": 2,
                      "bit_score": 108.358,
                      "score": 56,
                      "evalue": 3.15269e-026,
                      "identity": 88,
                      "query_from": 573,
                      "query_to": 666,
                      "query_strand": "Plus",
                      "hit_from": 1,
                      "hit_to": 89,
                      "hit_strand": "Plus",
                      "align_len": 94,
                      "gaps": 5,
                      "qseq": "GATCACAGGTCTATCACCCTATTAAACCACTCACGGGGAGCTCTCCATGCATTTGGTATTTTTCGTCTGGGGGGGGTATGCACGCGATAACATT",
                      "hseq": "GATCACAGGTCTATCACCCTATTAA-CCACTCACGGG-AGCTCTCCATGCATTTGGTA-TTTTCGTCT--GGGGGGTATGCACGCGATAGCATT",
                      "midline": "||||||||||||||||||||||||| ||||||||||| |||||||||||||||||||| |||||||||  ||||||||||||||||||| ||||"
                    }
                  ]
                }
              ],
              "stat": {
                "hsp_len": 14,
                "eff_space": 13111560,
                "kappa": 0.620991117264206,
                "lambda": 1.33270576282382,
                "entropy": 1.12409184650114
              }
            }
          ]
        }
      }
    }
  ]
}

I'm using GSON and by looking at some examples some people use Class to define everything into the JSON file, but I don't know if this is the best way to aproch this particula case, because I just want the results part from this JSON, can anyone help me with this?

Bruno Andrade
  • 243
  • 3
  • 7
  • 17
  • Does this help? https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Collection-with-Objects-of-Arbitrary-Types – ajb Jun 03 '17 at 20:10
  • You might be better off using a simpler library with GSON for this. While you can do ad-hoc parsing with GSON, it's not its primary purpose . – pvg Jun 04 '17 at 01:08

1 Answers1

1

You don't need to create a bunch of class to parse your complicated JSON string. Let's parse it to a HashMap then iterate through it to get what you want.

Type type = new TypeToken<HashMap<String, Object>>(){}.getType();
HashMap<String, Object> myMap = gson.fromJson("your_json_string", type);

By this way, you have a HashMap with multiple level, let's iterate through myMap by using a recursive method to get the result you want.

Sample code:

public static void main(String[] args) throws ParseException, JsonSyntaxException, IOException {
    Type type = new TypeToken<HashMap<String, Object>>() {
    }.getType();
    Gson gson = new Gson();
    HashMap<String, Object> map = gson.fromJson("your_json_string", type);
    for (String key : map.keySet()) {
        Object obj = map.get(key);
        if (obj instanceof List) {
            for (Object o : (List) obj) {
                if (o instanceof Map) {
                    loop((Map) o);
                } else {
                    System.out.println(key + " : " + o);
                }
            }
        } else if (obj instanceof Map) {
            loop((Map) obj);
        } else {
            System.out.println(key + " : " + obj);
        }
    }
}

private static void loop(Map<String, Object> map) {
    for (String key : map.keySet()) {
        Object obj = map.get(key);
        if (obj instanceof List) {
            for (Object o : (List) obj) {
                if (o instanceof Map) {
                    loop((Map) o);
                } else {
                    System.out.println(key + " : " + o);
                }
            }
        } else if (obj instanceof Map) {
            loop((Map) obj);
        } else {
            System.out.println(key + " : " + obj);
        }
    }
}
TuyenNTA
  • 1,194
  • 1
  • 10
  • 19
  • I was trying to do that way, like this Map> map = gson.fromJson(reader, new TypeToken>>() {}.getType()); but I was getting a error always or expected BEGIN_ARRAY or BEGIN_OBJECT so I'm kinda Stuck – Bruno Andrade Jun 04 '17 at 01:56
  • I have edited the code, change HashMap to HashMap. For this HashMap you can parse your JSON successfully, to Iterate through your map, you need to check the type of any element (instanceof HashMap, instanceof List or instanceof String). – TuyenNTA Jun 04 '17 at 02:02
  • for (Map.Entry outer : map.entrySet()) { if (outer.getValue() instanceof List) { List lista = (List) outer.getValue(); for (Object string : lista) { // if (string instanceof List) { System.out.println(string); // } } } } Is this correct? How do I get the result part? Can you help me? – Bruno Andrade Jun 04 '17 at 05:26