Android开发:如何从.js格式URL获取数据?
如何从指定JS URL获取数据并导入Android金融应用?
嘿,我来帮你搞定这个问题!你要抓取的这个JS文件其实是直接定义了一个包含港股行情数据的变量,咱们一步步来实现数据的获取和解析:
1. 先搞清楚目标JS的结构
这个URL返回的内容大概是这种格式:
var quote_00001_r = {
"code": "00001",
"name": "长和",
"price": "65.25",
// 其他行情字段...
};
核心就是把{}包裹的JSON部分提取出来,这就是咱们需要的有效数据。
2. 在Android中发起网络请求获取JS内容
我推荐用OkHttp(Android生态里最常用的网络库)来做请求,步骤如下:
第一步:添加依赖
在你的Module级别的build.gradle文件里加入OkHttp的依赖:
implementation 'com.squareup.okhttp3:okhttp:4.11.0'
第二步:编写请求代码
注意:Android不允许在主线程发起网络请求,所以咱们用协程来处理(这是现在最主流的异步处理方式):
import okhttp3.OkHttpClient import okhttp3.Request import kotlinx.coroutines.launch import androidx.lifecycle.viewModelScope // 如果用ViewModel的话,或用其他协程作用域 // 初始化OkHttp客户端 val okHttpClient = OkHttpClient() // 在ViewModel或者Activity/Fragment的协程中执行请求 viewModelScope.launch { try { val request = Request.Builder() .url("http://money18.on.cc/js/real/quote/00001_r.js") .build() val response = okHttpClient.newCall(request).execute() if (response.isSuccessful) { // 获取JS文件的文本内容 val jsContent = response.body?.string() ?: "" // 下一步解析数据 parseJsToData(jsContent) } else { // 处理请求失败的情况,比如打印错误码 Log.e("DataFetch", "请求失败,错误码: ${response.code}") } } catch (e: IOException) { // 处理网络异常,比如无网络的情况 Log.e("DataFetch", "网络出问题啦: ${e.message}") } }
3. 解析JS内容,提取有效数据
拿到JS文本后,咱们需要把里面的JSON部分抠出来,然后解析成Android可以直接用的实体类:
第一步:添加JSON解析库(比如Gson)
同样在build.gradle里加依赖:
implementation 'com.google.code.gson:gson:2.10.1'
第二步:编写解析逻辑
import com.google.gson.Gson fun parseJsToData(jsContent: String) { // 找到JSON的起始和结束位置:从第一个{到最后一个} val jsonStartIndex = jsContent.indexOf('{') val jsonEndIndex = jsContent.lastIndexOf('}') if (jsonStartIndex != -1 && jsonEndIndex != -1) { // 提取JSON字符串 val jsonString = jsContent.substring(jsonStartIndex, jsonEndIndex + 1) // 用Gson解析成实体类 val gson = Gson() val stockQuote = gson.fromJson(jsonString, StockQuote::class.java) // 现在stockQuote就是你需要的行情数据啦,可以直接用在你的金融应用里 Log.d("DataParse", "成功获取到${stockQuote.name}的价格:${stockQuote.price}") } else { Log.e("DataParse", "哎呀,没找到有效的JSON数据,可能JS格式变了?") } } // 根据JS里的字段定义对应的实体类,字段名要和JS里的一致哦 data class StockQuote( val code: String, val name: String, val price: String, // 这里可以根据JS里的其他字段继续添加,比如change, volume等等 )
4. 必须注意的几个坑
- 网络权限:一定要在
AndroidManifest.xml里添加网络权限:<uses-permission android:name="android.permission.INTERNET" /> - HTTP明文请求限制:这个URL是HTTP协议的,Android 9及以上默认禁止明文HTTP请求。解决办法是创建一个网络安全配置文件:
在res/xml目录下新建network_security_config.xml:
然后在<?xml version="1.0" encoding="utf-8"?> <network-security-config> <domain-config cleartextTrafficPermitted="true"> <domain includeSubdomains="true">money18.on.cc</domain> </domain-config> </network-security-config>AndroidManifest.xml的application标签里引用:<application ... android:networkSecurityConfig="@xml/network_security_config"> ... </application> - 数据格式兼容性:如果目标网站改了JS的变量名或者结构,你的解析逻辑也要跟着调整,建议加一些异常捕获,避免崩溃。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

