2016-11-02 3 views
1

Im mit Retrofit gibt die folgende api zuzugreifen:Verwendung Retrofit und Gson mit einer API, die dynamischen Spitzen JSON

https://api.nasa.gov/neo/rest/v1/feed?api_key=DEMO_KEY

Das near_earth_objects Objekt mehrere Arrays mit jeweils einem Schlüssel enthält ein Datum repräsentiert. Dieser Wert ändert sich offensichtlich, wenn Sie auf ein anderes Datum zugreifen.

Wie üblich habe ich meine POJOs nach der zurückgegebenen JSON-Struktur definiert. Im Folgenden ist meine Haupt Antwort Klasse:

public class AsteroidResponse { 

    private Links links; 

    @SerializedName("element_count") 
    private Integer elementCount; 

    @SerializedName("near_earth_objects") 
    private NearEarthObjects nearEarthObjects; 

    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 
    //getters and setters 
} 

Die NearEarthObjects Klasse sieht wie folgt aus:

public class NearEarthObjects { 

    private List<Observation> observation = new ArrayList<>(); 

    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 
    //getters and setters 
} 

ich, bevor sie in dieser Frage laufen habe, und konnte einen Map<String, SomeCustomModel> verwenden, um es zu bekommen Parst automatisch und setze das Datum als Schlüssel in der Karte. Diese Methode wird in einigen Antworten zu SO vorgeschlagen.

Ich habe versucht, das gleiche in dieser Situation zu tun, die zuvor erwähnte Klasse ersetzen wie folgt aussehen:

public class NearEarthObjects { 

    private Map<String, Observation> observation = new HashMap<>(); 

    private Map<String, Object> additionalProperties = new HashMap<String, Object>(); 
} 

Leider diesmal, um dieses Verfahren nicht wie erwartet zu funktionieren scheint. Die Karte wird leer zurückgegeben. Was könnte das Problem sein? Was wäre der beste Weg, um meine Modelle so zu strukturieren, dass der zurückgegebene JSON korrekt analysiert wird?

Antwort

0

Ich denke, die einfache Möglichkeit, Ihre Json Daten innerhalb Objekt near_earth_objects zu analysieren, dass Ihre json Strukturierung wie die zurückgegeben:

"near_earth_objects":[ 
    { 
     "date":"2016-11-07", 
     "data":[ 
     { 
      "links":{ 
       "self":"https://api.nasa.gov/neo/rest/v1/neo/3758255?api_key=DEMO_KEY" 
      }, 
      "neo_reference_id":"3758255", 
      "name":"(2016 QH44)", 
      "nasa_jpl_url":"http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3758255", 
      "absolute_magnitude_h":22.381, 
      "estimated_diameter":{ 
       "kilometers":{ 
        "estimated_diameter_min":0.0887881438, 
        "estimated_diameter_max":0.1985363251 
       }, 
       "meters":{ 
        "estimated_diameter_min":88.7881437713, 
        "estimated_diameter_max":198.5363250687 
       }, 
       "miles":{ 
        "estimated_diameter_min":0.0551703777, 
        "estimated_diameter_max":0.1233647148 
       }, 
       "feet":{ 
        "estimated_diameter_min":291.2996936107, 
        "estimated_diameter_max":651.3659167384 
       } 
      }, 
      "is_potentially_hazardous_asteroid":false, 
      "close_approach_data":[ 
       { 
        "close_approach_date":"2016-11-07", 
        "epoch_date_close_approach":1478505600000, 
        "relative_velocity":{ 
        "kilometers_per_second":"9.9505291907", 
        "kilometers_per_hour":"35821.9050865416", 
        "miles_per_hour":"22258.3387466903" 
        }, 
        "miss_distance":{ 
        "astronomical":"0.1045395934", 
        "lunar":"40.6659011841", 
        "kilometers":"15638901", 
        "miles":"9717563" 
        }, 
        "orbiting_body":"Earth" 
       } 
      ] 
     }, 
     { 
      "links":{ 
       "self":"https://api.nasa.gov/neo/rest/v1/neo/3758255?api_key=DEMO_KEY" 
      }, 
      "neo_reference_id":"3758255", 
      "name":"(2016 QH44)", 
      "nasa_jpl_url":"http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3758255", 
      "absolute_magnitude_h":22.381, 
      "estimated_diameter":{ 
       "kilometers":{ 
        "estimated_diameter_min":0.0887881438, 
        "estimated_diameter_max":0.1985363251 
       }, 
       "meters":{ 
        "estimated_diameter_min":88.7881437713, 
        "estimated_diameter_max":198.5363250687 
       }, 
       "miles":{ 
        "estimated_diameter_min":0.0551703777, 
        "estimated_diameter_max":0.1233647148 
       }, 
       "feet":{ 
        "estimated_diameter_min":291.2996936107, 
        "estimated_diameter_max":651.3659167384 
       } 
      }, 
      "is_potentially_hazardous_asteroid":false, 
      "close_approach_data":[ 
       { 
        "close_approach_date":"2016-11-07", 
        "epoch_date_close_approach":1478505600000, 
        "relative_velocity":{ 
        "kilometers_per_second":"9.9505291907", 
        "kilometers_per_hour":"35821.9050865416", 
        "miles_per_hour":"22258.3387466903" 
        }, 
        "miss_distance":{ 
        "astronomical":"0.1045395934", 
        "lunar":"40.6659011841", 
        "kilometers":"15638901", 
        "miles":"9717563" 
        }, 
        "orbiting_body":"Earth" 
       } 
      ] 
     } 
     ] 
    } 
// The other objects 
] 

wenn Sie die dynamische Schlüssel analysieren möchten. Sie können diesen Link verwenden: How to parse a dynamic JSON key in a Nested JSON result?

+0

Ja, wie es derzeit strukturiert ist falsch, aber ich besitze nicht die API. In einer der Antworten in dem Link, den du erwähnt hast, haben sie auch versucht, eine 'Map ' zu verwenden, obwohl das, wie gesagt, in meinem Szenario nicht zu funktionieren scheint. Ich könnte den JSON manuell parsen, aber ich möchte, dass Gson so viel wie möglich behandelt. – Orbit

+0

U kann 'JSON' manuell parsen, indem Sie JSON als String definieren und' JSONObject' dazu verwenden. [Link] (http://stackoverflow.com/questions/7304002/how-to-parse-a-dynamic-json-key-in-a-nested-json-result) –

Verwandte Themen