Parsing a long JSON using GSON

≡放荡痞女 提交于 2019-12-13 08:59:03

问题


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?


回答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);
        }
    }
}


来源:https://stackoverflow.com/questions/44348120/parsing-a-long-json-using-gson

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!