Simplest way to read json from a URL in java

后端 未结 11 990
情书的邮戳
情书的邮戳 2020-11-22 04:15

This might be a dumb question but what is the simplest way to read and parse JSON from URL in Java?

In Groovy, it\

11条回答
  •  梦毁少年i
    2020-11-22 04:57

    Here's a full sample of how to parse Json content. The example takes the Android versions statistics (found from Android Studio source code here, which links to here).

    Copy the "distributions.json" file you get from there into res/raw, as a fallback.

    build.gradle

        implementation 'com.google.code.gson:gson:2.8.6'
    

    manifest

      
    

    MainActivity.kt

    class MainActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            if (savedInstanceState != null)
                return
            thread {
                // https://cs.android.com/android/platform/superproject/+/studio-master-dev:tools/adt/idea/android/src/com/android/tools/idea/stats/DistributionService.java
                var root: JsonArray
                Log.d("AppLog", "loading...")
                try {
                    HttpURLConnection.setFollowRedirects(true)
                    val statsUrl = "https://dl.google.com/android/studio/metadata/distributions.json" //just a string
                    val url = URL(statsUrl)
                    val request: HttpURLConnection = url.openConnection() as HttpURLConnection
                    request.connectTimeout = 3000
                    request.connect()
                    InputStreamReader(request.content as InputStream).use {
                        root = JsonParser.parseReader(it).asJsonArray
                    }
                } catch (e: Exception) {
                    Log.d("AppLog", "error while loading from Internet, so using fallback")
                    e.printStackTrace()
                    InputStreamReader(resources.openRawResource(R.raw.distributions)).use {
                        root = JsonParser.parseReader(it).asJsonArray
                    }
                }
                val decimalFormat = DecimalFormat("0.00")
                Log.d("AppLog", "result:")
    
                root.forEach {
                    val androidVersionInfo = it.asJsonObject
                    val versionNickName = androidVersionInfo.get("name").asString
                    val versionName = androidVersionInfo.get("version").asString
                    val versionApiLevel = androidVersionInfo.get("apiLevel").asInt
                    val marketSharePercentage = androidVersionInfo.get("distributionPercentage").asFloat * 100f
                    Log.d("AppLog", "\"$versionNickName\" - $versionName - API$versionApiLevel - ${decimalFormat.format(marketSharePercentage)}%")
                }
            }
        }
    }
    

    As alternative to the dependency, you can also use this instead:

    InputStreamReader(request.content as InputStream).use {
        val jsonArray = JSONArray(it.readText())
    }
    

    and the fallback:

    InputStreamReader(resources.openRawResource(R.raw.distributions)).use {
        val jsonArray = JSONArray(it.readText())
    }
    

    The result of running this:

    loading...
    result:
    "Ice Cream Sandwich" - 4.0 - API15 - 0.20%
    "Jelly Bean" - 4.1 - API16 - 0.60%
    "Jelly Bean" - 4.2 - API17 - 0.80%
    "Jelly Bean" - 4.3 - API18 - 0.30%
    "KitKat" - 4.4 - API19 - 4.00%
    "Lollipop" - 5.0 - API21 - 1.80%
    "Lollipop" - 5.1 - API22 - 7.40%
    "Marshmallow" - 6.0 - API23 - 11.20%
    "Nougat" - 7.0 - API24 - 7.50%
    "Nougat" - 7.1 - API25 - 5.40%
    "Oreo" - 8.0 - API26 - 7.30%
    "Oreo" - 8.1 - API27 - 14.00%
    "Pie" - 9.0 - API28 - 31.30%
    "Android 10" - 10.0 - API29 - 8.20%
    

提交回复
热议问题