使用GSON解析长JSON [英] Parsing a long JSON using GSON
问题描述
$ b
{
BlastOutput2:[
{
报告:{
程序:blastn,
版本:BLASTN 2.6.0+,
参考: Stephen F. Altschul,Thomas L.Madden,Alejandro A. Sch& auml; ffer,Jinghui Zhang,Zheng Zhang,Webb Miller和David J.Lipman(1997),空位BLAST和PSI-BLAST:新生成蛋白质数据库搜索程序,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 |智人线粒体,完整基因组
],
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: 加,
align_len:516,
空白:6,
qseq:GTATTGACTCACCGCTTAACAACGGCAATGTATTTCGTACATTACTGCCAGCCACAAAGAAAGTTGTACAGTACCATAAATACTTGACTACCTGTAGTACATAAAAACTCAACCCACATCAAAACCCCAAAAGACGAGACAGAAAAGCAAGTTTTTCAATCAACCTTCAACTGTCACACATCAAC TGCAACTCCAAAGCCACCCCTCACCCACTAGGATATCAACAAACCTACCCGCCCTTAACAGTACATAGCACATAAAGTCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTTTTTTTTGTGGTCCCCTGACCACCATCCTCCGTGTTTTTTTTTTTTCTCGCACAAGAGTGCTACTCTCCTCGTTCTGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAGCCTAAATAGCCCACACGTTCCCCTTTTTATAAGACATCACGATG
HSEQ: GTATTGACTCACCCATCAACAACCGCTATGTATTTCGTACATTACTGCCAGCCACCATGAATATTGTACGGTACCATAAATACTTGACCACCTGTAGTACATAAAAACCCAATCCACATCAAAACCCCCTCC - CCATGCTTACAAGCAAGTACAGCAATCAACCCTCAACTATCACACATCAACTGCAACTCCAAAGCCACCCCTCACCCACTAGGATACCAACAAACCTACCCACCCTTAACAGTACATAGTACATAAAGCCATTTACCGTACATAGCACATTACAGTCAAATCCCTTCTCGTCCCCATGGATGACCCCCCTCAGATAGG-GGTCCCTTGACCACCATCCTCCGTG - AAATCAATATCCCGCACAAGAGTGCTACTCTCCTCGCTCCGGGCCCATAACACTTGGGGGTAGCTAAAGTGAACTGTATCCGACATCTGGTTCCTACTTCAGGGTCATAAAGCCTAAATAGCCCACACGTTCCCC-TTAAATAAGACATCACGATG,
中线: ||||||||||||| | |||||| || |||||||||||||||||||||||||||| | ||| |||||| |||||||||||||||||| ||||||||||||||||||| ||| ||||||||||||||| | | | | |||||||| ||||||||| |||||| ||||||||||||||||||||||||||||||||||||||||||||||| |||||||||||||| ||||||||||||||||| |||||||| |||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||| | | |||||| |||||||||||||||||| | | || |||||||||||||||||||||||| || |||||||||||||||||||||||||||||||||||||||||||||||||| ||||||||||||||||||||||||||||||||||||||||||||| || ||||||||||
},
{
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,
间隙: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,任何人都可以帮助我吗?
我们把它解析为一个 HashMap
,然后迭代它以得到你想要的结果。 类型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);
$ b} else if(obj instanceof Map){
loop((Map)obj);
} else {
System.out.println(key +:+ obj);
$ b 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);
$ b} else if(obj instanceof Map){
loop((Map)obj);
} else {
System.out.println(key +:+ obj);
}
}
}
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?
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);
}
}
}
这篇关于使用GSON解析长JSON的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!