Как получить случайный ключ из файла Json, чтобы я мог отобразить его значение? - PullRequest
0 голосов
/ 11 января 2020

Работа над приложением Android с использованием KOTLIN. В своей деятельности я получаю доступ к файлу Merriam-Webster Dictionary JSON по URL (Github). Файл довольно большой, если не сказать больше. Я хочу, чтобы «Слово дня» отображалось случайным образом в моем TextView, что означает, что мне нужно получить случайный ключ из JSON, чтобы я мог отобразить его значение.

Как мне это сделать это?

Заранее спасибо

DictionaryActivity.kt

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_dictionary)
        fetchJson()
        init()
    }

    private fun init(){
        val email = intent.extras!!.getString("email", "")
        welcomeTxv.text = "Welcome, " + email.substringBefore("@")
    }

    // Fetching (url) and searching through json.
    private fun fetchJson(){
        println("Attempting to fetch Json file")

        val url = "https://raw.githubusercontent.com/matthewreagan/WebstersEnglishDictionary/master/dictionary.json"

        val request = Request.Builder().url(url).build()
        val client = OkHttpClient()
        client.newCall(request).enqueue(object: Callback{
            override fun onResponse(call: Call, response: Response) {
                val body = response.body?.string()
                @Suppress("NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS") val jsonObject = JSONObject(body)
                loadingCircle.visibility = if (loadingCircle.visibility == View.VISIBLE){
                    View.INVISIBLE
                } else{
                    View.VISIBLE
                }

                searchBtn.setOnClickListener {
                    if (searchField.text.isNotEmpty() && jsonObject.has(searchField.text.toString())){
                        meaningTextView.setTextColor(WHITE)
                        meaningTextView.text = jsonObject.optString(searchField.text.toString())
                        databaseAction()
                    }else{
                        meaningTextView.setTextColor(RED)
                        meaningTextView.text = "The word you searched for could not be found."
                    }

                }


            }

            override fun onFailure(call: Call, e: IOException) {
                Toast.makeText(applicationContext, "Request failed", Toast.LENGTH_SHORT).show()
            }
        })
    }

    fun databaseAction(){
        val email = intent.extras!!.getString("email", "")
        val userIdentification = email.toString()
        val database = FirebaseDatabase.getInstance()
        val myRef = database.getReference(userIdentification.substringBefore("@"))
        val sdf = SimpleDateFormat.getDateInstance()
        val currentDate = sdf.format(Date())
        val stf = SimpleDateFormat.getTimeInstance()
        val currentTime = stf.format(Date())
        myRef.push().setValue(searchField.text.toString() + " " + currentDate + " " + currentTime)
    }

Не работает (вылетает приложение):

val keys = arrayOf(jsonObject.keys())
                val randomNumber = (0..1000).random()
                val randomKey = keys[randomNumber]

1 Ответ

0 голосов
/ 13 января 2020

приложение аварийно завершилось, потому что индекс вне связанной исключительной ситуации throws ...

 // keys() document from Android doc page
 open fun keys(): MutableIterator<String!>

keys () возвращает тип MutableIterator

для дополнительная информация: Android JSON ссылка на документ

keys тип является массивом MutableIterator, а его длина равна 1, поэтому приведенное ниже выражение может выбросить индекс из границ исключение, если randomNumber не равен 0

val randomKey = keys[randomNumber] // opps if randomNumber is not zero

для получения случайного ключа от ключей:

// shuffled() will return a list with random order
// first() take the first element of the list
val randomKey = xxxx.keys.shuffled().first()

no Android окружение в моей руке, вот мое предположение

val randomKey = jsonObject.keys().asSequence().toList().shuffled().first()

надеюсь, это поможет вам:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...