Android开发:全面解析如何接收与解析页面JSON数据**
在Android应用开发中,与服务器进行数据交互是非常常见的需求,JSON(JavaScript Object Notation)因其轻量级、易读易写以及与JavaScript的良好兼容性,成为了Android应用与服务器之间数据交换的主流格式,本文将详细介绍在Android应用中如何从网络页面(通常指服务器API接口)接收JSON数据,并对其进行解析的多种方法。
网络请求基础:获取JSON字符串
要接收页面的JSON数据,首先需要通过网络请求从指定的URL获取数据,在Android中,进行网络请求需要注意以下几点:
- 网络权限:在
AndroidManifest.xml文件中必须添加网络权限。<uses-permission android:name="android.permission.INTERNET" />
- 网络线程:Android 9.0(API 28)及以上默认禁止HTTP明文流量,推荐使用HTTPS,所有网络操作都不能在主线程(UI线程)中进行,否则会抛出
NetworkOnMainThreadException异常,通常我们会使用AsyncTask(已废弃,但早期常用)、Thread+Handler,或者更现代的Coroutine(协程)、RxJava等方式来处理网络请求。
常用网络请求库简介:
- HttpURLConnection:Android SDK内置,无需额外依赖,但使用相对繁琐。
- OkHttp:Square公司出品,高效、简洁、支持HTTP/2,是目前Android开发中最流行的网络库之一。
- Volley:Google官方推荐,适合数据量不大、通信频繁的场景,但已不再积极维护。
下面我们以OkHttp为例,展示如何获取JSON字符串。
步骤1:添加OkHttp依赖
在app/build.gradle文件的dependencies块中添加:
implementation("com.squareup.okhttp3:okhttp:4.12.0") // 请使用最新版本
步骤2:创建OkHttpClient并发起请求
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
// 在非UI线程中执行
private void fetchJsonData() {
new Thread(new Runnable() {
@Override
public void run() {
try {
OkHttpClient client = new OkHttpClient();
Request request = new Request.Builder()
.url("https://api.example.com/data") // 替换为你的API URL
.build();
Response response = client.newCall(request).execute();
if (response.isSuccessful()) {
String jsonData = response.body().string();
// 获取到JSON字符串后,进行解析
parseJson(jsonData);
} else {
// 处理请求失败
Log.e("NetworkError", "Request failed: " + response.code());
}
} catch (IOException e) {
e.printStackTrace();
}
}
}).start();
}
使用Kotlin协程(更推荐):
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.OkHttpClient
import okhttp3.Request
suspend fun fetchJsonData(): String {
return withContext(Dispatchers.IO) {
val client = OkHttpClient()
val request = Request.Builder()
.url("https://api.example.com/data")
.build()
client.newCall(request).execute().use { response ->
if (!response.isSuccessful) throw IOException("Unexpected code $response")
response.body!!.string()
}
}
}
// 在ViewModel或其他合适的地方调用
// viewModelScope.launch {
// val jsonData = fetchJsonData()
// parseJson(jsonData)
// }
JSON数据解析
获取到JSON字符串后,下一步就是将其解析成Android可以使用的对象,如List、Map或自定义的Java/Kotlin类。
使用Gson(Google推荐的JSON解析库)
Gson可以将JSON字符串直接转换为Java对象,也可以将Java对象转换为JSON字符串。
步骤1:添加Gson依赖
在app/build.gradle中:
implementation("com.google.code.gson:gson:2.10.1") // 请使用最新版本
步骤2:创建与JSON结构对应的实体类
假设服务器返回的JSON数据如下:
{
"name": "张三",
"age": 30,
"emails": ["zhangsan@example.com", "zs123@test.com"],
"address": {
"street": "科技路1号",
"city": "西安"
}
}
对应的Kotlin实体类(使用data class非常方便):
data class User(
val name: String,
val age: Int,
val emails: List<String>,
val address: Address
)
data class Address(
val street: String,
val city: String
)
Java实体类:
public class User {
private String name;
private int age;
private List<String> emails;
private Address address;
// 构造方法、Getter和Setter省略
}
public class Address {
private String street;
private String city;
// 构造方法、Getter和Setter省略
}
步骤3:使用Gson解析
// 在fetchJsonData方法中,获取jsonData后调用
private void parseJson(String jsonData) {
Gson gson = new Gson();
try {
User user = gson.fromJson(jsonData, User.class);
// 解析成功,可以更新UI或进行其他操作
runOnUiThread(new Runnable() {
@Override
public void run() {
// 将用户名显示在TextView上
textViewName.setText("姓名: " + user.getName());
textViewAge.setText("年龄: " + user.getAge());
// ...
}
});
} catch (JsonSyntaxException e) {
e.printStackTrace();
// 处理解析异常
}
}
Kotlin中使用Gson解析:
import com.google.gson.Gson
fun parseJson(jsonData: String) {
val gson = Gson()
val user = gson.fromJson(jsonData, User::class.java)
// 更新UI
textViewName.text = "姓名: ${user.name}"
textViewAge.text = "年龄: ${user.age}"
}
使用Moshi(Square出品,与OkHttp同源,Kotlin友好)
Moshi专注于Kotlin和Java的JSON序列化,在Kotlin中利用@Json注解和默认参数等特性,代码更简洁。
步骤1:添加Moshi依赖
implementation("com.squareup.moshi:moshi:1.15.0") // 最新版本
kapt("com.squareup.moshi:moshi-kotlin-codegen:1.15.0") // 用于生成Adapter(可选,但推荐)
步骤2:定义实体类(使用@JsonClass注解)
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class User(
@Json(name = "name") val name: String,
@Json(name = "age") val age: Int,
@Json(name = "emails") val emails: List<String>,
@Json(name = "address") val address: Address
)
@JsonClass(generateAdapter = true)
data class Address(
@Json(name = "street") val street: String,
@Json(name = "city") val city: String
)
步骤3:使用Moshi解析
import com.squareup.moshi.Moshi
fun parseJsonWithMoshi(jsonData: String) {
val moshi = Moshi.Builder().build()
val userAdapter = moshi.adapter(User::class.java)
val user = userAdapter.fromJson(jsonData)
user?.let {
// 更新UI
textViewName.text = "姓名: ${it.name}"
textViewAge.text = "年龄: ${it.age}"
}
}
使用AndroidX的org.json(轻量级,无需额外依赖)
如果不想引入第三方库,可以使用Android SDK自带的org.json包。
步骤1:无需额外依赖
步骤2:解析JSON
import org.json.JSONObject;
import org.json.JSONArray;
private void parseJsonWithOrgJson(String jsonData) {
try {
JSONObject jsonObject = new JSONObject(jsonData);
String name = jsonObject.getString("name");
int age = jsonObject.getInt("age");
JSONArray emailsArray = jsonObject.getJSONArray("emails");
List<String> emails = new ArrayList<>();
for (int i = 0; i < emailsArray.length(); i++) {
emails.add(emailsArray.getString(i));
}
JSONObject addressJson = jsonObject.getJSONObject("address");
String street = addressJson.getString("street");
String city = addressJson.getString("city");
// 手动构造对象或直接使用解析出的数据
Log.d("JSON", "Name: " + name + ", Age: " + age + ", City: " + city);
} catch (Exception e) {
e.printStackTrace();
}


还没有评论,来说两句吧...