讲师中心 微信公众号
AI工具推荐 视频效率加速

在Java/Android中从JSONArray根据键获取特定值并进行筛选

雨瑶小哥_4675

雨瑶小哥_4675

发布时间:2025-11-30 14:19:14

|

839人浏览过

|

来源于php中文网

原创

在Java/Android中从JSONArray根据键获取特定值并进行筛选

本文详细介绍了在java和android开发中如何高效地解析json数组(jsonarray),从中提取特定键对应的值,并在此基础上实现数据筛选。内容涵盖json对象的遍历、值获取、异常处理以及结合实际场景(如根据邮箱地址筛选经纬度信息)的代码实现,旨在提供一个结构清晰、易于理解的教程。

1. 理解JSON数据结构

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,也易于机器解析和生成。在Java和Android开发中,我们经常需要处理来自服务器的JSON数据。

JSON数据主要有两种基本结构:

  • JSON对象 (JSONObject):一个无序的“键/值”对集合。键是一个字符串,值可以是字符串、数字、布尔值、另一个JSON对象、JSON数组或null。在Java中通常对应 org.json.JSONObject 类。
  • JSON数组 (JSONArray):一个有序的值集合。每个值可以是任何JSON数据类型(字符串、数字、布尔值、JSON对象、JSON数组等)。在Java中通常对应 org.json.JSONArray 类。

本教程将重点讲解如何处理包含多个JSON对象的 JSONArray。

2. 解析JSONArray并提取数据

假设我们有一个包含多个用户位置信息的 JSONArray,每个对象包含 num、email、lati(纬度)、longt(经度)和 time 等字段。我们的目标是解析这个数组,并提取 lati 和 longt 值。

立即学习“Java免费学习笔记(深入)”;

2.1 将JSON字符串转换为JSONArray对象

首先,你需要将接收到的JSON字符串转换为 JSONArray 对象。

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.List;

public class JsonParserExample {

    // 假设这是你从API获取到的JSON字符串
    private static final String JSON_DATA = "[" +
            "    {" +
            "        "num": "34304"," +
            "        "email": "<a class=\"__cf_email__\" data-cfemail=\"2f4e4e4e4e6f424e4643014e4b4b5d4a5c5c\" href=\"/cdn-cgi/l/email-protection\">[email&#160;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&#160;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&#160;protected]</a>"," +
            "        "lati": "8888"," +
            "        "longt": "88888"," +
            "        "time": "8888888"" +
            "    }," +
            "    {" +
            "        "num": "34301"," +
            "        "email": "<a class=\"__cf_email__\" data-cfemail=\"7716161616371a161e1b5916131305120404\" href=\"/cdn-cgi/l/email-protection\">[email&#160;protected]</a>"," +
            "        "lati": "8888"," +
            "        "longt": "88888"," +
            "        "time": "8888888"" +
            "    }," +
            "    {" +
            "        "num": "34300"," +
            "        "email": "<a class=\"__cf_email__\" data-cfemail=\"1f7c7c7c7c5f727e7673317e7b7b6d7a6c6c\" href=\"/cdn-cgi/l/email-protection\">[email&#160;protected]</a>"," +
            "        "lati": "8888"," +
            "        "longt": "88888"," +
            "        "time": "8888888"" +
            "    }" +
            "]";

    public static void main(String[] args) {
        try {
            JSONArray jsonArray = new JSONArray(JSON_DATA);
            System.out.println("成功将JSON字符串转换为JSONArray,包含 " + jsonArray.length() + " 个元素。");
        } catch (JSONException e) {
            e.printStackTrace();
            System.err.println("JSON解析错误: " + e.getMessage());
        }
    }
}

2.2 遍历JSONArray并获取JSONObject

JSONArray 实际上是一个 JSONObject 的列表。我们需要遍历这个数组,对每个 JSONObject 进行处理。

YiHui GITHUB MONITOR
YiHui GITHUB MONITOR

监控多个 GitHub 仓库,配置发布、PR 与安全告警策略,通过定时 cron 任务推送低噪声通知。

下载
// 假设你已经有了JSONArray jsonArray
for (int i = 0; i < jsonArray.length(); i++) {
    try {
        JSONObject jsonObject = jsonArray.getJSONObject(i); // 获取当前索引的JSONObject
        // 或者更安全的做法:
        // JSONObject jsonObject = jsonArray.optJSONObject(i); 
        // optJSONObject在索引越界或元素不是JSONObject时返回null,避免抛出JSONException

        // 现在可以从jsonObject中提取值
        String num = jsonObject.getString("num");
        String email = jsonObject.getString("email");
        String lati = jsonObject.getString("lati");
        String longt = jsonObject.getString("longt");
        String time = jsonObject.getString("time");

        System.out.println("--- 元素 " + i + " ---");
        System.out.println("Num: " + num);
        System.out.println("Email (raw): " + email);
        System.out.println("Lati: " + lati);
        System.out.println("Longt: " + longt);
        System.out.println("Time: " + time);

    } catch (JSONException e) {
        e.printStackTrace();
        System.err.println("处理JSONArray中的元素时发生错误: " + e.getMessage());
    }
}

2.3 从JSONObject中提取特定值

JSONObject 提供了多种方法来获取不同类型的值:

  • getString(String key): 获取字符串值。
  • getInt(String key): 获取整数值。
  • getDouble(String key): 获取双精度浮点数值。
  • getBoolean(String key): 获取布尔值。
  • getJSONObject(String key): 获取嵌套的JSONObject。
  • getJSONArray(String key): 获取嵌套的JSONArray。

与 get 方法对应的,还有 opt 方法(如 optString、optInt 等)。opt 方法在键不存在时不会抛出 JSONException,而是返回一个默认值(例如 optString 返回空字符串,optInt 返回0,optJSONObject 返回null),这在处理可选字段时非常有用。

在我们的例子中,lati 和 longt 都是字符串类型,但我们通常需要将它们转换为 double 类型以表示地理坐标。

// ... 在上面的for循环内部 ...
String latiStr = jsonObject.getString("lati");
String longtStr = jsonObject.getString("longt");

try {
    double latitude = Double.parseDouble(latiStr);
    double longitude = Double.parseDouble(longtStr);
    System.out.println("Parsed Lati: " + latitude + ", Parsed Longt: " + longitude);
    // 可以在这里将latitude和longitude存储到自定义对象或列表中
} catch (NumberFormatException e) {
    System.err.println("纬度或经度值格式错误: " + latiStr + ", " + longtStr);
}

3. 应用筛选逻辑:根据Email筛选数据

原始问题要求根据特定的邮箱地址筛选数据。在我们的JSON数据中,email 字段是一个HTML <a> 标签,其中包含了实际的邮箱地址。我们需要先从这个HTML标签中提取出纯文本的邮箱地址,然后再进行筛选。

3.1 提取纯文本Email地址

由于 email 字段是 <a ...>[email protected]</a> 这样的HTML结构,直接获取 getString("email") 会得到整个HTML字符串。我们需要从这个字符串中提取 [email protected]。一种简单的方法是使用正则表达式或字符串替换来移除HTML标签。

// 辅助方法:从HTML字符串中提取纯文本邮箱
private static String extractEmailFromHtml(String htmlEmail) {
    // 移除所有HTML标签
    String plainText = htmlEmail.replaceAll("<[^>]*>", "");
    // 替换HTML实体 &#160; 为普通空格
    plainText = plainText.replace("&#160;", " ");
    return plainText.trim();
}

// ... 在for循环内部,获取email字符串后 ...
String rawEmail = jsonObject.getString("email");
String cleanEmail = extractEmailFromHtml(rawEmail);
System.out.println("Cleaned Email: " + cleanEmail);

// 假设我们要筛选的邮箱是 "[email protected]"
String targetEmail = "[email protected]";

if (cleanEmail.equals(targetEmail)) {
    // 匹配成功,提取经纬度
    String latiStr = jsonObject.getString("lati");
    String longtStr = jsonObject.getString("longt");
    try {
        double latitude = Double.parseDouble(latiStr);
        double longitude = Double.parseDouble(longtStr);
        System.out.println("--- 找到匹配邮箱的数据 ---");
        System.out.println("Email: " + cleanEmail);
        System.out.println("Lati: " + latitude);
        System.out.println("Longt: " + longitude);
        // 将匹配的经纬度添加到结果列表中
    } catch (NumberFormatException e) {
        System.err.println("筛选后纬度或经度值格式错误: " + latiStr + ", " + longtStr);
    }
}

4. 完整示例代码

结合上述所有步骤,下面是一个完整的Java代码示例,演示如何解析JSON数组,提取经纬度,并根据邮箱地址进行筛选。

为了更好地组织数据,我们定义一个简单的 LatLng 类来存储经纬度。

import org.json.JSONArray;
import org.json.JSONObject;
import org.json.JSONException;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

// 模拟Android中的LatLng类
class LatLng {
    public double latitude;
    public double longitude;

    public LatLng(double latitude, double longitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    }

    @Override
    public String toString() {
        return "LatLng{" +
               "latitude=" + latitude +
               ", longitude=" + longitude +
               '}';
    }
}

public class JsonDataProcessor {

    private static final String JSON_DATA = "[" +
            "    {" +
            "        "num": "34304"," +
            "        "email": "<a class=\"__cf_email__\" data-cfemail=\"2f4e4e4e4e6f424e4643014e4b4b5d4a5c5c\" href=\"/cdn-cgi/l/email-protection\">[email&#160;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&#160;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&#160;protected]</a>"," +
            "        "lati": "8888"," +
            "        "longt": "88888"," +
            "        "time": "8888888"" +
            "    }," +
            "    {" +
            "        "num": "34301"," +
            "        "email": "<a class=\"__cf_email__\" data-cfemail=\"7716161616371a161e1b5916131305120404\" href=\"/cdn-cgi/l/email-protection\">[email&#160;protected]</a>"," +
            "        "lati": "8888"," +
            "        "longt": "88888"," +
            "        "time": "8888888"" +
            "    }," +
            "    {" +
            "        "num": "34300"," +
            "        "email": "<a class=\"__cf_email__\" data-cfemail=\"1f7c7c7c7c5f727e7673317e7b7b6d7a6c6c\" href=\"/cdn-cgi/l/email-protection\">[email&#160;protected]</a>"," +
            "        "lati": "8888"," +
            "        "longt": "88888"," +
            "        "time": "8888888"" +
            "    }" +
            "]";

    /**
     * 从HTML字符串中提取纯文本邮箱地址。
     * 例如,从 "<a ...>[email&#160;protected]</a>" 提取 "[email protected]"
     *
     * @param htmlEmail 包含邮箱的HTML字符串
     * @return 纯文本邮箱地址,如果无法提取则返回空字符串。
     */
    private static String extractEmailFromHtml(String htmlEmail) {
        // 使用正则表达式匹配<a>标签内部的文本内容
        // Pattern pattern = Pattern.compile("(?<=>)(.*?)(?=<)"); // 匹配标签内部所有内容
        // 更精确地匹配 [email @] 格式
        Pattern pattern = Pattern.compile("\[email&#160;@\][^\]]*"); // 匹配 [email @] 后面的内容直到 ]
        Matcher matcher = pattern.matcher(htmlEmail);
        if (matcher.find()) {
            String extracted = matcher.group(0);
            // 替换HTML实体 &#160

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

蛙蛙写作

一款AI论文写作工具,主要用于超级AI智能写作助手,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

2095

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

3162

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

1056

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

3579

2025.09.10

js正则表达式
js正则表达式

php中文网为大家提供各种js正则表达式语法大全以及各种js正则表达式使用的方法,还有更多js正则表达式的相关文章、相关下载、相关课程,供大家免费下载体验。

4236

2023.06.20

正则表达式不包含
正则表达式不包含

正则表达式,又称规则表达式,,是一种文本模式,包括普通字符和特殊字符,是计算机科学的一个概念。正则表达式使用单个字符串来描述、匹配一系列匹配某个句法规则的字符串,通常被用来检索、替换那些符合某个模式的文本。php中文网给大家带来了有关正则表达式的相关教程以及文章,希望对大家能有所帮助。

2781

2023.07.05

java正则表达式语法
java正则表达式语法

java正则表达式语法是一种模式匹配工具,它非常有用,可以在处理文本和字符串时快速地查找、替换、验证和提取特定的模式和数据。本专题提供java正则表达式语法的相关文章、下载和专题,供大家免费下载体验。

7622

2023.07.05

java正则表达式匹配字符串
java正则表达式匹配字符串

在Java中,我们可以使用正则表达式来匹配字符串。本专题为大家带来java正则表达式匹配字符串的相关内容,帮助大家解决问题。

812

2023.08.11

Linux 新手先学哪些命令
Linux 新手先学哪些命令

Linux新手命令专题汇集终端基础、文件目录操作、文本查看、软件安装和权限管理等入门文章,帮助按实际任务练习常用命令并建立命令行操作习惯。

0

2026.10.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
WebStorm 官方调试文档
WebStorm 官方调试文档

共0课时 | 0人学习

React 教程
React 教程

共58课时 | 12.2万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 6.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn