有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java使用GSON解析长JSON

我正试图解析这样一个很长的JSON

{
  "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
              }
            }
          ]
        }
      }
    }
  ]
}

我使用的是GSON,通过查看一些示例,一些人使用Class将所有内容定义到JSON文件中,但我不知道这是否是解决这个特殊情况的最佳方法,因为我只想从这个JSON中获得结果部分,有人能帮我吗


共 (1) 个答案

  1. # 1 楼答案

    不需要创建一堆类来解析复杂的JSON字符串。让我们将其解析为HashMap,然后遍历它以获得所需的内容

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

    这样,您就有了一个具有多个级别的HashMap,让我们使用递归方法迭代myMap,以获得您想要的结果

    示例代码:

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