2017-06-03 189 views
-2

我試圖解析這樣一個很長的JSON。使用GSON解析長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並通過看一些例子一些人利用類的一切定義成JSON文件,但我不知道這是否是aproch這種particula情況下,最好的辦法,因爲我只是想從這個JSON的結果部分,任何人都可以幫助我呢?

+0

這是否幫助? https://sites.google.com/site/gson/gson-user-guide#TOC-Serializing-and-Deserializing-Collection-with-Objects-of-Arbitrary-Types – ajb

+0

您可能更適合使用更簡單的庫GSON爲此。雖然您可以使用GSON進行臨時解析,但這不是它的主要目的。 – pvg

回答

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

我試圖這樣做,像這樣Map > map = gson.fromJson(reader,new TypeToken >>(){}。的getType());但我得到一個總是或預期的錯誤BEGIN_ARRAY或BEGIN_OBJECT所以我有點卡住 –

+0

我編輯了代碼,將HashMap 更改爲HashMap 。對於這個HashMap,你可以成功解析你的JSON,遍歷你的地圖,你需要檢查任何元素的類型(instanceof HashMap,instanceof List或instanceof String)。 –

+0

爲(Map.Entry的<字符串,對象>外:map.entrySet()){ \t \t \t \t如果(outer.getValue()的instanceof列表){ \t \t \t \t \t列表 LISTA =(列表 )outer.getValue(); \t \t \t \t \t爲(對象字符串:LISTA){ \t \t \t \t \t \t \t // \t \t \t \t \t如果(串的instanceof列表){ \t \t \t \t \t \t的System.out.println(串); \t \t \t \t \t \t // \t \t \t \t \t \t} \t \t \t \t \t} \t \t \t \t} \t \t \t} 這是正確的嗎?我如何得到結果部分?你可以幫我嗎? –