2010-11-03 36 views
0

Je voudrais analyser une réponse de l'API NYT Search au format JSON. La chaîne JSON se présente comme suit (extrait):Analyse de l'API NYTimes Search avec Gson: comment désérialiser des éléments JSON imbriqués?

{"facets" : 
    {"des_facet" : 
    [ 
     {"count" : 745 , "term" : "POLITICS AND GOVERNMENT"} , 
     {"count" : 702 , "term" : "UNITED STATES INTERNATIONAL RELATIONS"} 
    ], 
    "desk_facet" : 
    [ 
     {"count" : 2251 , "term" : "Foreign Desk"} , 
     {"count" : 242 , "term" : "Editorial Desk"} 
    ] 
    } 
} 

Sur Java côté, je préparais la hiérarchie des objets suivants:

public class Container { 
    Facet facets; 
} 

public class Facet { 
    Collection<Elements> des_facet; 
    Collection<Elements> desk_facet; 
} 

public class Elements { 
    private int count; 
    private String term; 
} 

... qui est évidemment ne fonctionne pas. Je suis nouveau à JSON. Par conséquent, la structure imbriquée des éléments est source de confusion.

Merci pour votre aide!

Répondre

1

La structure de classe définie correspond parfaitement à l'exemple JSON et désérialise sans erreur pour moi.

// output: 
// {Container: 
// facets= 
// {Facet: 
//  des_facet=[ 
//  {Elements: count=745, term=POLITICS AND GOVERNMENT}, 
//  {Elements: count=702, term=UNITED STATES INTERNATIONAL RELATIONS} 
//  ], 
//  desk_facet=[ 
//  {Elements: count=2251, term=Foreign Desk}, 
//  {Elements: count=242, term=Editorial Desk} 
//  ] 
// } 
// } 

import java.io.FileReader; 
import java.util.Collection; 

import com.google.gson.Gson; 

public class Foo 
{ 
    public static void main(String[] args) throws Exception 
    { 
    Gson gson = new Gson(); 
    Container container = gson.fromJson(new FileReader("input.json"), Container.class); 
    System.out.println(container); 
    } 
} 

class Container 
{ 
    Facet facets; 

    @Override 
    public String toString() 
    { 
    return String.format("{Container: facets=%s}", facets); 
    } 
} 

class Facet 
{ 
    Collection<Elements> des_facet; 
    Collection<Elements> desk_facet; 

    @Override 
    public String toString() 
    { 
    return String.format("{Facet: des_facet=%s, desk_facet=%s}", des_facet, desk_facet); 
    } 
} 

class Elements 
{ 
    private int count; 
    private String term; 

    @Override 
    public String toString() 
    { 
    return String.format("{Elements: count=%d, term=%s}", count, term); 
    } 
}