
本教程详细介绍了如何在Java和Android环境中解析JSON数组(JSONArray),并根据特定键(如邮箱地址)的值进行数据过滤。文章涵盖了从JSON字符串到Java对象的转换、遍历数组、提取指定字段(如经纬度)以及处理嵌套在HTML标签中的邮箱地址等核心步骤,旨在帮助开发者高效地从复杂JSON结构中获取所需信息。
在现代应用程序开发中,JSON(JavaScript Object Notation)已成为数据交换的事实标准。特别是在Android或Java后端开发中,经常需要处理来自API响应的JSON数据。本教程将指导您如何有效地解析一个包含多个JSON对象的数组(JSONArray),并根据某个特定字段(例如电子邮件地址)来过滤数据,最终提取出您感兴趣的其他字段(例如经度和纬度)。
我们处理的JSON数据是一个数组,其中每个元素都是一个JSON对象,代表一条记录。每个记录包含“num”、“email”、“lati”、“longt”和“time”等字段。
[
{
"num": "34304",
"email": "<a class="__cf_email__" data-cfemail="2f4e4e4e4e6f424e4643014e4b4b5d4a5c5c" href="/cdn-cgi/l/email-protection">[email protected]</a>",
"lati": "8888888",
"longt": "88888888",
"time": "2022-12-08 21:15:39"
},
{
"num": "34303",
"email": "<a class="__cf_email__" data-cfemail="2c4d4d4d4d6c414d4540024d48485e495f5f" href="/cdn-cgi/l/email-protection">[email protected]</a>",
"lati": "8888",
"longt": "88888",
"time": "8888888"
}
// ... 更多数据
]需要注意的是,email字段的值被包裹在一个HTML <a> 标签中,这是常见的反垃圾邮件技术。我们需要从中提取纯文本的邮箱地址。
立即学习“Java免费学习笔记(深入)”;
在Java或Android项目中,通常使用org.json包来处理JSON数据。如果您在Android Studio中开发,这个库通常是内置的。对于纯Java项目,您可能需要手动导入相关库。
以下步骤将详细说明如何解析JSON数组,遍历其中的对象,并根据指定的邮箱地址进行过滤,最终提取出经纬度信息。
首先,您需要将JSON字符串转换为JSONArray对象。假设您的JSON数据存储在一个名为jsonString的字符串变量中。
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
public class JsonParser {
public static void parseAndFilterJson(String jsonString, String targetEmail) {
try {
JSONArray jsonArray = new JSONArray(jsonString);
// ... 后续处理
} catch (JSONException e) {
e.printStackTrace();
System.err.println("JSON解析错误: " + e.getMessage());
}
}
}JSONArray可以像普通数组一样通过索引进行遍历。在每次迭代中,我们获取一个JSONObject,它代表数组中的一个数据项。
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class JsonParser {
public static void parseAndFilterJson(String jsonString, String targetEmail) {
try {
JSONArray jsonArray = new JSONArray(jsonString);
System.out.println("开始解析并过滤JSON数据...");
for (int i = 0; i < jsonArray.length(); i++) {
JSONObject jsonObject = jsonArray.optJSONObject(i); // 使用optJSONObject更安全,避免空指针
if (jsonObject != null) {
// 提取并处理email字段
String rawEmailHtml = jsonObject.optString("email", "");
String extractedEmail = extractEmailFromHtml(rawEmailHtml); // 自定义方法处理HTML包裹的邮箱
// 提取经纬度
String lati = jsonObject.optString("lati", "0.0");
String longt = jsonObject.optString("longt", "0.0");
// 进行过滤
if (extractedEmail.equals(targetEmail)) {
System.out.println("找到匹配的邮箱: " + extractedEmail);
System.out.println(" 纬度 (lati): " + lati);
System.out.println(" 经度 (longt): " + longt);
// 您可以在这里将lati和longt添加到列表中,或进行其他操作
}
}
}
System.out.println("JSON数据解析过滤完成。");
} catch (JSONException e) {
e.printStackTrace();
System.err.println("JSON解析错误: " + e.getMessage());
}
}
/**
* 从HTML字符串中提取纯文本邮箱地址。
* 假设邮箱地址位于<a>标签的文本内容中,且格式为[email protected]。
* 更健壮的HTML解析应使用Jsoup等库。
*/
private static String extractEmailFromHtml(String html) {
if (html == null || html.isEmpty()) {
return "";
}
// 匹配<a>...</a>标签中的内容
Pattern pattern = Pattern.compile("<a[^>]*>([^<]+)</a>");
Matcher matcher = pattern.matcher(html);
if (matcher.find()) {
String emailText = matcher.group(1);
// 进一步处理[email protected]这种格式,如果需要解密
// 对于本例,我们假设目标邮箱也是"[email protected]"这种形式
return emailText;
}
return ""; // 如果没有找到匹配的邮箱格式,返回空字符串
}
public static void main(String[] args) {
String sampleJson = "[" +
" {" +
" "num": "34304"," +
" "email": "<a class=\"__cf_email__\" data-cfemail=\"2f4e4e4e4e6f424e4643014e4b4b5d4a5c5c\" href=\"/cdn-cgi/l/email-protection\">[email protected]</a>"," +
" "lati": "8888888"," +
" "longt": "88888888"," +
" "time": "2022-12-08 21:15:39"" +
" }," +
" {" +
" "num": "34303"," +
" "email": "<a class=\"__cf_email__\" data-cfemail=\"2c4d4d4d4d6c414d4540024d48485e495f5f\" href=\"/cdn-cgi/l/email-protection\">[email protected]</a>"," +
" "lati": "8888"," +
" "longt": "88888"," +
" "time": "8888888"" +
" }," +
" {" +
" "num": "34302"," +
" "email": "<a class=\"__cf_email__\" data-cfemail=\"3c5e5e5e5e7c515d5550125d58584e594f4f\" href=\"/cdn-cgi/l/email-protection\">[email protected]</a>"," +
" "lati": "8888"," +
" "longt": "88888"," +
" "time": "8888888"" +
" }" +
"]";
// 假设我们要查找的邮箱是"[email protected]"
String targetEmailToFind = "[email protected]";
parseAndFilterJson(sampleJson, targetEmailToFind);
}
}代码说明:
在Android开发中,通常会将经纬度字符串转换为LatLng对象,以便在地图等组件中使用。
import com.google.android.gms.maps.model.LatLng; // 假设您已导入Google Maps SDK
// ... 在parseAndFilterJson方法内部的过滤条件中 ...
if (extractedEmail.equals(targetEmail)) {
try {
double latitude = Double.parseDouble(lati);
double longitude = Double.parseDouble(longt);
LatLng latLng = new LatLng(latitude, longitude);
System.out.println(" 生成LatLng对象: " + latLng.latitude + ", " + latLng.longitude);
// latLngList.add(latLng); // 如果有列表,可以添加到列表中
} catch (NumberFormatException e) {
System.err.println("经纬度格式错误: " + lati + ", " + longt);
}
}通过本教程,您应该掌握了在Java/Android中解析JSONArray、遍历JSONObject、提取特定字段以及根据条件过滤数据的基本方法。理解并应用这些技术,将使您能够高效地处理各种JSON数据,为您的应用程序提供所需的数据支持。记住,健壮的错误处理和对数据格式的细致考量是开发高质量JSON解析逻辑的关键。
以上就是解析与过滤JSONArray:Java/Android中根据键值提取特定数据的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号