AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76994885
Accepted
David Frick
David Frick
Asked: 2023-08-29 01:30:16 +0800 CST2023-08-29 01:30:16 +0800 CST 2023-08-29 01:30:16 +0800 CST

Por que minha segunda iteração sobre as chaves de um JSONObject não está em execução?

  • 772

Eu tenho um JSONObjectque estou usando para criar uma tabela. Porém, quando uso as teclas uma segunda vez para criar cada uma das células, nada acontece. Incluí instruções de log para testar isso. Nenhum keys singular é impresso. Me chame de perplexo.

class MovieFragment : Fragment(), FinraDataInterface {

    private lateinit var binding: MovieFragmentBinding

    val finraDataInterface: FinraDataInterface = this

    override fun drawTable(jsonArrayData: JSONArray) {
//         ------ Draw the table -----
//         Draw the keys first
        val headerRow = TableRow(requireActivity())
        Log.d("jsonArray", jsonArrayData[0].toString())
        val firstRecord = jsonArrayData[0] as JSONObject
        val keys = firstRecord.keys()

        for (key in keys) {
            val textView = TextView(requireActivity())
            textView.text = key
            headerRow.addView(textView)
        }
        binding.table.addView(headerRow)

        // Draw the data second
        for (i in 0 until jsonArrayData.length()) {
            val record = jsonArrayData[i] as JSONObject
            Log.d("Record", record.toString())
            val tableRow = TableRow(requireActivity())
            Log.d("Table Row", "Table Row created")
            Log.d("Keys", listOf(keys).toString())

            // Error is right here.
            for (key in keys) {
                Log.d("key", key)
                val textView = TextView(requireActivity())
                val cellText = record[key] as String
                textView.text = cellText
                tableRow.addView(textView)
            }
            binding.table.addView(tableRow)
        }
    }

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View {
        binding = MovieFragmentBinding.inflate(layoutInflater)
        return binding.root
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        finraGetBondInfo("AMC")
    }




    private fun finraGetBondInfo(companyName: String) {
        val url = "https://www.finra.org/finra-data/fixed-income/corp-and-agency"

        val queue = Volley.newRequestQueue(requireActivity())
        var cfruid = ""

        val stringRequest = object: StringRequest(Request.Method.GET, url,
            { response ->
                Log.d("A", "Response is: " + response.substring(0,500))
            },
            { error ->
                Log.e("Error", error.toString())
            })
        {
            override fun  parseNetworkResponse(response : NetworkResponse) : Response<String> {
                // since we don't know which of the two underlying network vehicles
                // will Volley use, we have to handle and store session cookies manually
                Log.i("response", response.headers.toString());
                val cookies = HttpCookie.parse(response.headers?.get("Set-Cookie"))
                Log.d("Cookies:", cookies[0].toString())
                val indexOfEqualSign = cookies[0].toString().indexOf('=')
                cfruid = cookies[0].toString().substring(indexOfEqualSign + 1)
                Log.d("Cfruid:", cfruid)


                return super.parseNetworkResponse(response)
            }
        }

        queue.add(stringRequest)

        // Create our JSON Object for the finra call
        val json = JSONObject()
        val fieldsArray = JSONArray()
        fieldsArray.put("issueSymbolIdentifier")
        fieldsArray.put("issuerName")
        fieldsArray.put("isCallable")
        fieldsArray.put("productSubTypeCode")
        fieldsArray.put("couponRate")
        fieldsArray.put("maturityDate")
        fieldsArray.put("industryGroup")
        fieldsArray.put("moodysRating")
        fieldsArray.put("standardAndPoorsRating")
        fieldsArray.put("lastSalePrice")
        fieldsArray.put("lastSaleYield")
        json.put("fields", fieldsArray)

        json.put("dateRangeFilters", JSONArray())
        json.put("domainFilters", JSONArray())
        json.put("compareFilters", JSONArray())

        val multiJson = JSONObject()
        multiJson.put("fuzzy", false)
        multiJson.put("searchValue", companyName)
        multiJson.put("synonym", true)
        val subfieldsJson = JSONObject()
        subfieldsJson.put("name", "issuerName")
        subfieldsJson.put("boost", 1)
        val fieldsArray2 = JSONArray()
        fieldsArray2.put(subfieldsJson)
        multiJson.put("fields", fieldsArray2)
        val multiArray = JSONArray()
        multiArray.put(multiJson)

        json.put("multiFieldMatchFilters", multiArray)
        json.put("orFilters", JSONArray())
        json.put("aggregationFilter", JSONObject.NULL)
        val sortFieldsArray = JSONArray()
        sortFieldsArray.put("+issuerName")
        json.put("sortFields", sortFieldsArray)
        json.put("limit", 50)
        json.put("offset", 0)
        json.put("delimiter", JSONObject.NULL)
        json.put("quoteValues", false)

        Log.d("JSON", json.toString())


        val url2 = "https://services-dynarep.ddwa.finra.org/public/reporting/v2/data/group/FixedIncomeMarket/name/CorporateAndAgencySecurities"
        val request2 = object: JsonObjectRequest(Request.Method.POST, url2, json,
            { response ->
                // TODO replace this with our calls to make tab2 display bond data
                val returnBody =  response["returnBody"] as JSONObject
                var stringData = returnBody["data"] as String
                stringData = stringData.replace("\\n", "").replace("\\", "")
                val jsonArrayData = JSONArray(stringData)

                finraDataInterface.drawTable(jsonArrayData)
            },
            { error ->
                Log.e("Error", error.toString())
            })
        {
            override fun getHeaders(): MutableMap<String, String> {
                val headers = HashMap<String, String>()
                headers["Authority"] = "services-dynarep.ddwa.finra.org"
                headers["Accept"] = "application/json, text/plain, */*"
                headers["Cookie"] = "XSRF-TOKEN=$cfruid;"
                headers["Origin"] = "https://www.finra.org"
                headers["Referer"] = "https://www.finra.org/"
                headers["X-XSRF-token"] = cfruid
                headers["user-agent"] =  "python-requests/2.31.0"
                Log.d("headers:", headers.toString())
                return headers
            }

            override fun getBodyContentType(): String {
                return "application/json"
            }
        }
        queue.add(request2)

    }

}

O que me deixou particularmente confuso é que o primeiro loop for de uso das teclas para criar a linha do cabeçalho funciona bem. Tentei transmitir coisas para tipos diferentes para ver se era algum erro de tipo. No entanto, é apenas o segundo loop for que não está em execução. Não recebo nenhuma mensagem de erro. o que estou perdendo? Obrigado.

android
  • 1 1 respostas
  • 31 Views

1 respostas

  • Voted
  1. Best Answer
    broot
    2023-08-29T05:10:04+08:002023-08-29T05:10:04+08:00

    Supondo que você use a biblioteca JSON-java( org.json) aqui, observe que JSONObject.keys()o método retorna uma Iteratorchave over. Iterador é diferente de Iterablecoleções ou - é uma iteração "ao vivo" sobre alguns dados e pode ser consumido apenas uma vez. Depois de consumirmos todos os itens, o iterador fica constantemente no final dos dados e não fornece nenhum item adicional.

    É fácil ignorar isso, pois a maioria das bibliotecas não fornece iteradores, mas sim iteráveis ​​que podem ser consumidos várias vezes.

    Para corrigir o problema, precisamos criar outro iterador usando keys()ou podemos usar keySet(), que retorna um conjunto, para que possa ser iterado várias vezes. Se keySet()não estiver disponível, podemos converter um iterador em uma lista com: asSequence().toList().

    • 2

relate perguntas

  • Rolagem Recyclerview deve cobrir a barra de ferramentas

  • Fundo transbordado por pixels e não funciona função de navegação

  • Escolha uma cor em uma lista, matriz não encontrada no Android

  • Adicionar MapLibre a um novo projeto Android não está funcionando

  • Devo colocar imagens vetoriais em assets ou drawables? Eu tenho mil vetores no meu aplicativo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve