In this app I am using NASA API, I facing some trouble converting the JSON objects to ArrayList of objects (Asteroid)
Asteroid Data class
@Parcelize
data class Asteroid(val id: Long, val codename: String, val closeApproachDate: String,
val absoluteMagnitude: Double, val estimatedDiameter: Double,
val relativeVelocity: Double, val distanceFromEarth: Double,
val isPotentiallyHazardous: Boolean) : Parce
NetwotkUtil (Parser class) the problem happened here
private const val TAG = "NetworkUtils"
@RequiresApi(Build.VERSION_CODES.N)
fun parseAsteroidsJsonResult(jsonResult: JSONObject): ArrayList<Asteroid> {
val nearEarthObjectsJson = jsonResult.getJSONObject("near_earth_objects")
val asteroidList = ArrayList<Asteroid>()
val nextSevenDaysFormattedDates = getNextSevenDaysFormattedDates()
for (formattedDate in nextSevenDaysFormattedDates) {
if (nearEarthObjectsJson.has(formattedDate)) {
val dateAsteroidJsonArray = nearEarthObjectsJson.getJSONArray(formattedDate)
for (i in 0 until dateAsteroidJsonArray.length()) {
val asteroidJson = dateAsteroidJsonArray.getJSONObject(i)
val id = asteroidJson.getLong("id")
val codename = asteroidJson.getString("name")
val absoluteMagnitude = asteroidJson.getDouble("absolute_magnitude_h")
val estimatedDiameter = asteroidJson.getJSONObject("estimated_diameter")
.getJSONObject("kilometers").getDouble("estimated_diameter_max")
val closeApproachData = asteroidJson
.getJSONArray("close_approach_data").getJSONObject(0)
val relativeVelocity = closeApproachData.getJSONObject("relative_velocity")
.getDouble("kilometers_per_second")
val distanceFromEarth = closeApproachData.getJSONObject("miss_distance")
.getDouble("astronomical")
val isPotentiallyHazardous = asteroidJson
.getBoolean("is_potentially_hazardous_asteroid")
val asteroid = Asteroid(id, codename, formattedDate, absoluteMagnitude,
estimatedDiameter, relativeVelocity, distanceFromEarth, isPotentiallyHazardous)
asteroidList.add(asteroid)
}
}
}
Log.d(TAG, "parseAsteroidsJsonResult: ${asteroidList.toString()}")
return asteroidList
}
@RequiresApi(Build.VERSION_CODES.N)
private fun getNextSevenDaysFormattedDates(): ArrayList<String> {
val formattedDateList = ArrayList<String>()
val calendar = Calendar.getInstance()
for (i in 0..Constants.DEFAULT_END_DATE_DAYS) {
val currentTime = calendar.time
val dateFormat = SimpleDateFormat(Constants.API_QUERY_DATE_FORMAT, Locale.getDefault())
formattedDateList.add(dateFormat.format(currentTime))
calendar.add(Calendar.DAY_OF_YEAR, 1)
}
return formattedDateList
}
the API service class
class NasaApiService {
interface AsteroidService {
@GET("neo/rest/v1/feed")
fun getAsteroids(
@Query("api_key") api_key: String
): Call<String>
}
object AsteroidApi {
private val okHttpClient: OkHttpClient = OkHttpClient.Builder()
.readTimeout(60, TimeUnit.SECONDS)
.connectTimeout(60, TimeUnit.SECONDS)
.build()
private val retrofit = Retrofit.Builder()
.baseUrl(Constants.BASE_URL)
.client(okHttpClient)
.addConverterFactory(ScalarsConverterFactory.create())
.build()
val retrofitService: AsteroidService by lazy { retrofit.create(AsteroidService::class.java) }
}
}
and finally MainViewModel
private const val TAG = "MainViewModel"
class MainViewModel : ViewModel() {
private val _response = MutableLiveData<List<Asteroid>>()
val response:LiveData<List<Asteroid>> get() = _response
fun getAsteroids() {
NasaApiService.AsteroidApi.retrofitService.getAsteroids(Constants.API_KEY).enqueue(
object : Callback<String>{
@RequiresApi(Build.VERSION_CODES.N)
override fun onResponse(call: Call<String>, response: Response<String>) {
if(response.isSuccessful){
response.body()?.let {
val obj = JSONObject(it)
Log.d(TAG, "onResponse: JSONObject ${obj.toString()}")
_response.value = parseAsteroidsJsonResult(obj)
Log.d(TAG, "onResponse: ${_response.value.toString()}")
Log.d(TAG, "onResponse: $it")
}
}else {
Log.e(TAG, "onResponse: ${response.errorBody().toString()}" )
Log.e(TAG, "onResponse: ${response.message()}" )
}
}
override fun onFailure(call: Call<String>, t: Throwable) {
Log.e(TAG, "onFailure: ${t.message.toString()}" )
Log.e(TAG, "onFailure: ${t.cause.toString()}" )
}
}
)
}
}
The following is the demo result
{
"links": {
"next": "http://api.nasa.gov/neo/rest/v1/feed?start_date=2015-09-08&end_date=2015-09-09&detailed=false&api_key=DEMO_KEY",
"previous": "http://api.nasa.gov/neo/rest/v1/feed?start_date=2015-09-06&end_date=2015-09-07&detailed=false&api_key=DEMO_KEY",
"self": "http://api.nasa.gov/neo/rest/v1/feed?start_date=2015-09-07&end_date=2015-09-08&detailed=false&api_key=DEMO_KEY"
},
"element_count": 25,
"near_earth_objects": {
"2015-09-08": [
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/2465633?api_key=DEMO_KEY"
},
"id": "2465633",
"neo_reference_id": "2465633",
"name": "465633 (2009 JR5)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=2465633",
"absolute_magnitude_h": 20.36,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.2251930467,
"estimated_diameter_max": 0.5035469604
},
"meters": {
"estimated_diameter_min": 225.1930466786,
"estimated_diameter_max": 503.5469604336
},
"miles": {
"estimated_diameter_min": 0.1399284286,
"estimated_diameter_max": 0.3128894784
},
"feet": {
"estimated_diameter_min": 738.8223552649,
"estimated_diameter_max": 1652.0570096689
}
},
"is_potentially_hazardous_asteroid": true,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 20:28",
"epoch_date_close_approach": 1441744080000,
"relative_velocity": {
"kilometers_per_second": "18.1279547773",
"kilometers_per_hour": "65260.6371983344",
"miles_per_hour": "40550.4220413761"
},
"miss_distance": {
"astronomical": "0.3027478814",
"lunar": "117.7689258646",
"kilometers": "45290438.204452618",
"miles": "28142173.3303294084"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3426410?api_key=DEMO_KEY"
},
"id": "3426410",
"neo_reference_id": "3426410",
"name": "(2008 QV11)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3426410",
"absolute_magnitude_h": 21.34,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.1434019235,
"estimated_diameter_max": 0.320656449
},
"meters": {
"estimated_diameter_min": 143.4019234645,
"estimated_diameter_max": 320.6564489709
},
"miles": {
"estimated_diameter_min": 0.0891057966,
"estimated_diameter_max": 0.1992466184
},
"feet": {
"estimated_diameter_min": 470.4787665793,
"estimated_diameter_max": 1052.0225040417
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 14:31",
"epoch_date_close_approach": 1441722660000,
"relative_velocity": {
"kilometers_per_second": "19.7498128142",
"kilometers_per_hour": "71099.3261312856",
"miles_per_hour": "44178.3562841869"
},
"miss_distance": {
"astronomical": "0.2591250701",
"lunar": "100.7996522689",
"kilometers": "38764558.550560687",
"miles": "24087179.7459520006"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3553060?api_key=DEMO_KEY"
},
"id": "3553060",
"neo_reference_id": "3553060",
"name": "(2010 XT10)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3553060",
"absolute_magnitude_h": 26.5,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.0133215567,
"estimated_diameter_max": 0.0297879063
},
"meters": {
"estimated_diameter_min": 13.3215566698,
"estimated_diameter_max": 29.7879062798
},
"miles": {
"estimated_diameter_min": 0.008277629,
"estimated_diameter_max": 0.0185093411
},
"feet": {
"estimated_diameter_min": 43.7058959846,
"estimated_diameter_max": 97.7293544391
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 12:07",
"epoch_date_close_approach": 1441714020000,
"relative_velocity": {
"kilometers_per_second": "19.1530348886",
"kilometers_per_hour": "68950.9255988812",
"miles_per_hour": "42843.4237422604"
},
"miss_distance": {
"astronomical": "0.4917435147",
"lunar": "191.2882272183",
"kilometers": "73563782.385433689",
"miles": "45710414.7542113482"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3726710?api_key=DEMO_KEY"
},
"id": "3726710",
"neo_reference_id": "3726710",
"name": "(2015 RC)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3726710",
"absolute_magnitude_h": 24.3,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.0366906138,
"estimated_diameter_max": 0.0820427065
},
"meters": {
"estimated_diameter_min": 36.6906137531,
"estimated_diameter_max": 82.0427064882
},
"miles": {
"estimated_diameter_min": 0.0227984834,
"estimated_diameter_max": 0.0509789586
},
"feet": {
"estimated_diameter_min": 120.3760332259,
"estimated_diameter_max": 269.1689931548
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 09:45",
"epoch_date_close_approach": 1441705500000,
"relative_velocity": {
"kilometers_per_second": "19.486643553",
"kilometers_per_hour": "70151.9167909206",
"miles_per_hour": "43589.6729637806"
},
"miss_distance": {
"astronomical": "0.0269252677",
"lunar": "10.4739291353",
"kilometers": "4027962.697099799",
"miles": "2502859.9608192662"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3727181?api_key=DEMO_KEY"
},
"id": "3727181",
"neo_reference_id": "3727181",
"name": "(2015 RO36)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3727181",
"absolute_magnitude_h": 22.9,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.0699125232,
"estimated_diameter_max": 0.1563291544
},
"meters": {
"estimated_diameter_min": 69.9125232246,
"estimated_diameter_max": 156.3291544087
},
"miles": {
"estimated_diameter_min": 0.0434416145,
"estimated_diameter_max": 0.097138403
},
"feet": {
"estimated_diameter_min": 229.3718026961,
"estimated_diameter_max": 512.8909429502
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 14:36",
"epoch_date_close_approach": 1441722960000,
"relative_velocity": {
"kilometers_per_second": "15.8053596703",
"kilometers_per_hour": "56899.294813224",
"miles_per_hour": "35355.0090465835"
},
"miss_distance": {
"astronomical": "0.0540392535",
"lunar": "21.0212696115",
"kilometers": "8084157.219990045",
"miles": "5023262.364730821"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3727639?api_key=DEMO_KEY"
},
"id": "3727639",
"neo_reference_id": "3727639",
"name": "(2015 RN83)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3727639",
"absolute_magnitude_h": 21.7,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.1214940408,
"estimated_diameter_max": 0.2716689341
},
"meters": {
"estimated_diameter_min": 121.4940407996,
"estimated_diameter_max": 271.6689340891
},
"miles": {
"estimated_diameter_min": 0.0754928736,
"estimated_diameter_max": 0.1688071972
},
"feet": {
"estimated_diameter_min": 398.6025088171,
"estimated_diameter_max": 891.3023057169
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 15:42",
"epoch_date_close_approach": 1441726920000,
"relative_velocity": {
"kilometers_per_second": "12.0811420305",
"kilometers_per_hour": "43492.1113096542",
"miles_per_hour": "27024.3066079349"
},
"miss_distance": {
"astronomical": "0.1684193589",
"lunar": "65.5151306121",
"kilometers": "25195177.358205543",
"miles": "15655557.2525527734"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3730577?api_key=DEMO_KEY"
},
"id": "3730577",
"neo_reference_id": "3730577",
"name": "(2015 TX237)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3730577",
"absolute_magnitude_h": 23.3,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.058150704,
"estimated_diameter_max": 0.130028927
},
"meters": {
"estimated_diameter_min": 58.1507039646,
"estimated_diameter_max": 130.0289270043
},
"miles": {
"estimated_diameter_min": 0.0361331611,
"estimated_diameter_max": 0.0807962044
},
"feet": {
"estimated_diameter_min": 190.7831555951,
"estimated_diameter_max": 426.6041048727
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 14:19",
"epoch_date_close_approach": 1441721940000,
"relative_velocity": {
"kilometers_per_second": "6.573400491",
"kilometers_per_hour": "23664.2417675863",
"miles_per_hour": "14704.0395583094"
},
"miss_distance": {
"astronomical": "0.0795238758",
"lunar": "30.9347876862",
"kilometers": "11896602.433824546",
"miles": "7392205.9712328948"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3731587?api_key=DEMO_KEY"
},
"id": "3731587",
"neo_reference_id": "3731587",
"name": "(2015 UG)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3731587",
"absolute_magnitude_h": 22.81,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.0728710415,
"estimated_diameter_max": 0.1629446024
},
"meters": {
"estimated_diameter_min": 72.8710414898,
"estimated_diameter_max": 162.9446023625
},
"miles": {
"estimated_diameter_min": 0.0452799519,
"estimated_diameter_max": 0.1012490505
},
"feet": {
"estimated_diameter_min": 239.0782277615,
"estimated_diameter_max": 534.595169215
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 18:50",
"epoch_date_close_approach": 1441738200000,
"relative_velocity": {
"kilometers_per_second": "11.9557600601",
"kilometers_per_hour": "43040.7362163935",
"miles_per_hour": "26743.8396784585"
},
"miss_distance": {
"astronomical": "0.1132399881",
"lunar": "44.0503553709",
"kilometers": "16940461.018585347",
"miles": "10526314.3652659086"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3747356?api_key=DEMO_KEY"
},
"id": "3747356",
"neo_reference_id": "3747356",
"name": "(2016 EK158)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3747356",
"absolute_magnitude_h": 20.51,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.2101623793,
"estimated_diameter_max": 0.4699373665
},
"meters": {
"estimated_diameter_min": 210.1623793224,
"estimated_diameter_max": 469.9373664779
},
"miles": {
"estimated_diameter_min": 0.1305888078,
"estimated_diameter_max": 0.2920054513
},
"feet": {
"estimated_diameter_min": 689.5091405759,
"estimated_diameter_max": 1541.7893094353
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 10:26",
"epoch_date_close_approach": 1441707960000,
"relative_velocity": {
"kilometers_per_second": "16.9572901605",
"kilometers_per_hour": "61046.2445778734",
"miles_per_hour": "37931.7623600681"
},
"miss_distance": {
"astronomical": "0.2804752334",
"lunar": "109.1048657926",
"kilometers": "41958497.504392858",
"miles": "26071801.3837351204"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
{
"links": {
"self": "http://api.nasa.gov/neo/rest/v1/neo/3758838?api_key=DEMO_KEY"
},
"id": "3758838",
"neo_reference_id": "3758838",
"name": "(2016 RT)",
"nasa_jpl_url": "http://ssd.jpl.nasa.gov/sbdb.cgi?sstr=3758838",
"absolute_magnitude_h": 24.4,
"estimated_diameter": {
"kilometers": {
"estimated_diameter_min": 0.0350392641,
"estimated_diameter_max": 0.0783501764
},
"meters": {
"estimated_diameter_min": 35.0392641108,
"estimated_diameter_max": 78.3501764334
},
"miles": {
"estimated_diameter_min": 0.0217723826,
"estimated_diameter_max": 0.0486845275
},
"feet": {
"estimated_diameter_min": 114.9582192654,
"estimated_diameter_max": 257.0543928497
}
},
"is_potentially_hazardous_asteroid": false,
"close_approach_data": [
{
"close_approach_date": "2015-09-08",
"close_approach_date_full": "2015-Sep-08 01:02",
"epoch_date_close_approach": 1441674120000,
"relative_velocity": {
"kilometers_per_second": "19.0983945697",
"kilometers_per_hour": "68754.220451069",
"miles_per_hour": "42721.1988130545"
},
"miss_distance": {
"astronomical": "0.170705627",
"lunar": "66.404488903",
"kilometers": "25537198.19621449",
"miles": "15868079.146520362"
},
"orbiting_body": "Earth"
}
],
"is_sentry_object": false
},
}
}
I succeeded with getting data from the server in String format but when I tried to parse it with the two methods above the process didn't succeed, I got an empty ArrayList
