Unable to parse Json result to ArrayList of objects

Viewed 37

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

enter image description here

0 Answers
Related