使用 Java 访问嵌套 JSON 对象的最佳方法

2023-12-01

我是使用 JSON 的新手,我想知道是否有更好的方法来完成我在下面的代码中所做的事情。您会注意到,要访问嵌套的 JSON 对象,我必须先创建子 JSON 对象/数组,然后才能访问 JSON 数组元素“leagues”。有没有更快或更简单的方法来做到这一点?

public static void main( String[] args ) throws UnirestException
{
    JsonNode response = Unirest.get("http://www.api-football.com/demo/api/v2/leagues")
            .header("x-rapidapi-host", "api-football-v1.p.rapidapi.com")
            .header("x-rapidapi-key", "")
            .asJson()
            .getBody();

    JSONObject json = new JSONObject( response );
    JSONArray jArray = json.getJSONArray( "array" );
    JSONObject jAPI = jArray.getJSONObject(0);
    JSONObject jLeagues = jAPI.getJSONObject( "api" );
    JSONArray jArrayLeagues = jLeagues.getJSONArray( "leagues" );

    for(int n = 0; n < jArrayLeagues.length(); n++) {
        JSONObject leagues = jArrayLeagues.getJSONObject(n);
        System.out.print(leagues.getString("name") + " " );
        System.out.print(leagues.getString("country") + " ");
        System.out.println( leagues.getInt("league_id") + " " );
    }
}

链接到 JSON 数据


您可以反序列化JSON有效负载到POJO类使用Gson or Jackson。另外,这两个库可以反序列化JSON to Java Collection - JSON Objects to Map and JSON Array to List, Set, array (T[])或任何其他集合。使用jsonschema2pojo你可以生成POJO给定的类JSON有效负载已经Gson or Jackson注释。

当您不需要处理整个过程时JSON有效负载你可以使用它来预处理它JsonPath图书馆。例如,如果您只想返回联赛名称,您可以使用$..leagues[*].name小路。你可以尝试使用在线工具并提供您的JSON和路径。

您的问题可以使用轻松解决Jackson如下:

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.core.JsonPointer;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.net.URL;
import java.util.List;

public class JsonApp {

    public static void main(String[] args) throws Exception {
        // workaround for SSL not related with a question
        SSLUtilities.trustAllHostnames();
        SSLUtilities.trustAllHttpsCertificates();

        String url = "https://www.api-football.com/demo/api/v2/leagues";

        ObjectMapper mapper = new ObjectMapper()
                // ignore JSON properties which are not mapped to POJO
                .disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);

        // we do not want to build model for whole JSON payload
        JsonNode node = mapper.readTree(new URL(url));

        // go to leagues JSON Array
        JsonNode leaguesNode = node.at(JsonPointer.compile("/api/leagues"));

        // deserialise "leagues" JSON Array to List of POJO
        List<League> leagues = mapper.convertValue(leaguesNode, new TypeReference<List<League>>(){});
        leagues.forEach(System.out::println);
    }
}

class League {
    @JsonProperty("league_id")
    private int id;
    private String name;
    private String country;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }

    @Override
    public String toString() {
        return "League{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", country='" + country + '\'' +
                '}';
    }
}

上面的代码打印:

League{id=2, name='Premier League', country='England'}
League{id=6, name='Serie A', country='Brazil'}
League{id=10, name='Eredivisie', country='Netherlands'}
League{id=132, name='Champions League', country='World'}

也可以看看:

  • 如何忽略 Jackson JSON 到对象映射中的枚举字段?
  • 让 Jackson 将单个 JSON 对象解释为包含一个元素的数组
  • 使用 Jackson 反序列化为自定义对象的 HashMap
  • 使用 Jackson 解析深度嵌套的 JSON 属性
  • 从 Java 类创建 JSON 模式
  • Gson 反序列化具有不同值类型的 json
  • 有什么简单的方法可以完全忽略带有 java url 连接的 ssl ?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java 访问嵌套 JSON 对象的最佳方法 的相关文章

随机推荐

  • 从 Angular 5 Universal 获取域名始终返回 127.0.0.1

    我在 Angular 5 应用程序的服务器端渲染方面遇到问题 我需要域来创建正确的链接 应用程序在不同的环境中使用 并且为每个端点创建几个包是个坏主意 所以我尝试使用堆栈中的选项 但我总是得到 127 0 0 1 4000 作为域 主机 我
  • 快速执行命令后获取终端输出

    我使用以下代码在终端中运行一些命令 system the command here 在我想知道运行这个命令的结果是什么之后 例如如果我跑 system git status 我想阅读有关我的存储库中更改的实际信息 有什么办法可以快速做到这一
  • 链表删除节点、简单链表

    我正在尝试实现一个从链表中删除节点的函数 到目前为止 我只能删除列表的第一个节点 3 我尝试从delete转到for循环 我以为内存没有分配好 我已经挣扎了几天 我不明白 请帮助我一点 这是我从大学收到的主题 include
  • 如何在 ASP.NET MVC 中禁用路由值的绑定?

    据我所知 ValueProviderDictionary 从 3 个地方获取绑定值 来自邮寄表格 来自路线值 来自查询字符串 我希望能够禁用第二个和第三个选项 我在这里看到的唯一解决方案是创建我自己的自定义 ValueProvider 复制
  • 网络浏览器打印

    Hi我正在使用 C WPF webbrowser 控件在本地计算机中显示 html 文件 我通过执行 webbrowser 控件的打印命令向我的应用程序添加了打印功能 但 Internet Explorer 的默认行为是在屏幕底部打印文件
  • ggplot2 PDF 输出中的 Unicode 字符

    如何在使用 ggplot2 创建的 PDF 绘图中使用 Unicode 字符作为标签 标题和类似内容 考虑以下示例 library ggplot2 qplot Sepal Length Petal Length data iris main
  • Python PyQT:如何从工作线程调用 GUI 函数?

    我有一个 pyqt gui 并调用一个长进程 ffmpeg 我将其放在一个单独的线程上以不阻塞 gui 然后 我想在较长命令列表中的一个命令完成时更新进度栏 问题是 我无法在工作线程之外调用 gui 线程中的函数 所以我让在工作线程中运行一
  • JCAPS 地狱小盒子

    Has anyone out there in SO land had to deal with this when you go to build a new deployment profile in JCAPS you have qu
  • avcodec_encode_video2 时出现分段错误

    我在尝试将 AVFrame 编码到数据包时遇到一些问题 在阅读整个代码之前 输入的东西正在工作 我测试了它 输出内容来自示例here 我认为是有问题的 但分段错误发生在接近末尾的循环中 这是我的简化代码 void nmain input s
  • 如何从列表中查找对象

    我使用以下程序创建从网站获取的城市列表 现在我想从我创建的列表中查找城市名称 参数 我怎么做 换句话说 如何从列表中找到对象 我试过 listOfCities find city 我收到错误 因为找不到属性 find def weather
  • 依赖于 package.json 中使用 git URL 的分支或标签?

    假设我已经分叉了一个带有错误修复程序的节点模块 并且我想在功能分支上使用我的修复版本 直到错误修复程序合并并发布 我如何在中引用我的固定版本dependencies of my package json 解决方案1 来自npm docs 使
  • 无法在 javafx 8 中加载 css 文件

    Scene listenMenu new Scene root 250 272 listenMenu getStylesheets add styles css 这对于我加载 css 文件总是有效 但是在一次小的 IntelliJ 更新之后
  • Parallel.ForEach - 访问修改后的闭包是否适用?

    我读过许多有关访问修改的闭包的其他问题 所以我了解基本原理 尽管如此 我还是无法判断 是吗 Parallel ForEach有同样的问题吗 以下面的代码片段为例 我重新计算了上周用户的使用情况统计数据 var startTime DateT
  • 我怎样才能修复反应中的路线错误

    我收到此警告 除了 App js 中包含 默认页面内容 的 之外 我看不到我的路线 我如何重写包含其他路线的代码 位置 admin 处的匹配叶路由没有元素 这意味着默认情况下它将呈现一个空值 从而导致 空 页面 我在用着 反应 17 0 2
  • for-each 内的方案延续

    我目前正在大学学习一门课程的计划 在查看一些练习时 我陷入了这个特定的练习中 教授尚未回复我之前的邮件 因此我有更多机会更快地收到答复 鉴于此代码 define list iter cc lst call cc lambda return
  • cin 的 isdigit 问题

    我有一个有符号整数变量 当我在 main 中执行此操作时 它也会给我整数值 错误 int main unsigned int a while cin gt gt a if isdigit a cout lt lt Error lt
  • ios NSError 类型

    自从我添加了这个async请求 我收到 xcode 错误Sending NSError const strong to parameter of type NSError autoreleasing changes retain relea
  • Rshinydashboard-根据用户输入显示/隐藏多个菜单项

    这个想法是有一个用户输入 访问代码 基于该输入可以访问不同的菜单项 所以基本上我们可以根据用户的要求提供自定义版本的应用程序 3 个菜单项的工作示例如下 library shiny library shinydashboard librar
  • 无法在 Java 应用程序中连接到 SQLServer 数据库

    我已在尝试开发的 JSF Web 应用程序中连接到我的数据库 使用 Windows 7 NetBeans 6 9 1 SQLServer 2008 Glassfish 3 3 我正在使用sqljdbc4 jar我从 XP 系统复制了驱动程序
  • 使用 Java 访问嵌套 JSON 对象的最佳方法

    我是使用 JSON 的新手 我想知道是否有更好的方法来完成我在下面的代码中所做的事情 您会注意到 要访问嵌套的 JSON 对象 我必须先创建子 JSON 对象 数组 然后才能访问 JSON 数组元素 leagues 有没有更快或更简单的方法