使用嵌套对象访问 jsonpath 元素

2023-12-20

我希望从数组和对象的 JSON 路径中提取某些值,并使用这些值进行进一步处理,并且正在努力访问这些元素。这是 JSON 响应:

[  
 {  
  "od_pair":"7015400:8727100",
  "buckets":[  
     {  
        "bucket":"C00",
        "original":2,
        "available":2
     },
     {  
        "bucket":"A01",
        "original":76,
        "available":0
     },
     {  
        "bucket":"B01",
        "original":672,
        "available":480
     }
    ]
    },
 {  
  "od_pair":"7015400:8814001",
  "buckets":[  
     {  
        "bucket":"C00",
        "original":2,
        "available":2
     },
     {  
        "bucket":"A01",
        "original":40,
        "available":40
     },
     {  
        "bucket":"B01",
        "original":672,
        "available":672
     },
     {  
        "bucket":"B03",
        "original":632,
        "available":632
     },
     {  
        "bucket":"B05",
        "original":558,
        "available":558
     }
    ]
 }
]

我尝试使用 $ 访问根元素,但无法进一步使用它。

这是我写的测试方法。我想提取 od_pair 的值,并且在每个 od_pair 中,我需要能够检索存储桶代码及其可用编号。

public static void updateBuckets(String ServiceName, String DateOfJourney) throws Exception {
    File jsonExample = new File(System.getProperty("user.dir"), "\\LogAvResponse\\LogAvResponse.json");
    JsonPath jsonPath = new JsonPath(jsonExample);

    List<Object> LegList = jsonPath.getList("$");
    // List<HashMap<String, String>> jsonObjectsInArray = jsonPath.getList("$");

    int NoofLegs = LegList.size();
    System.out.println("No of legs :" + NoofLegs);
    for (int j = 0; j <= NoofLegs; j++)
    // for (HashMap<String, String> jsonObject : jsonObjectsInArray) {
    {

        String OD_Pair = jsonPath.param("j", j).getString("[j].od_pair");
        // String OD_Pair = jsonObject.get("od_pair");

        System.out.println("OD Pair: " + OD_Pair);
        List<Object> BucketsList = jsonPath.param("j", j).getList("[j].buckets");

        int NoOfBuckets = BucketsList.size();
        // System.out.println("OD Pair: " + OD_Pair);
        System.out.println("no of Buckets: " + NoOfBuckets);

        for (int i = 0; i < NoOfBuckets; i++) {
            String BucketCode = jsonPath.param("j", j).param("i", i).getString("[j].buckets[i].bucket");
            String Available = jsonPath.param("j", j).param("i", i).getString("[j].buckets[i].available");

            int BucketCodeColumn = XLUtils.getBucketCodeColumn(BucketCode);
            int ServiceRow = XLUtils.getServiceRow(ServiceName, DateOfJourney, OD_Pair);
            System.out.println("Row of " + ServiceName + ":" + DateOfJourney + "is:" + ServiceRow);
            System.out.println("Bucket Code column of " + BucketCode + " is: " + BucketCodeColumn);
            XLUtils.updateAvailability(ServiceRow, BucketCodeColumn, Available);
        }
    }

}

}

这是我看到的错误:

Caused by: 
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup 
failed:
Script1.groovy: 1: unexpected token: [ @ line 1, column 27.
restAssuredJsonRootObject.[j].od_pair

有人能帮助我吗?


我建议将 JSON 解析为 Java 类以简化处理。

怎么做? 首先,我们需要创建 Java 类来表示您提供的 JSON。

我们来分析一下 JSON。 从一个数组开始。该数组包含多个 JSON 对象。这些对象包含od_pair调用的对象的值和数组buckets.

让我们创建一个类(你可以随意命名)Pair

public class Pair {
    public String od_pair; //this name is important because it corresponds with the json element's name!
    public List<BucketObject> buckets; //same here!
}

此类表示主数组中的单个 JSON 对象。它包含od_pair值 AND 嵌套 JSON 数组,但采用 Java 表示形式 -> 列表BucketObject类。让我们来创建BucketObject class:

public class BucketObject { //this name is NOT importnat
    public String bucket; //names are important
    public int original;
    public int available;
}

每个对象中只有 3 个值。

现在,是时候将 JSON 解析为编写的类了。

JsonPath path = JsonPath.from(json);
Pair[] pairs = path.getObject("$", Pair[].class);

请记住Pair是单个 JSON 对象。这就是为什么我们从美元符号代表的根开始解析$我们声明 JSON 应该被解析为一个数组Pair物体!

现在,处理将变得更加简单!

我不确定您需要什么,但我将向您展示一个如何基于以下内容从存储桶中获取数据的示例od_pair字段,您应该能够弄清楚其余的处理过程。

所以,我们有 Pair 类的数组:Pair[] pairs;

现在,我们想要基于以下条件获得 1 Pair 对象od_pair value.

    public static Pair getPairBasedOnOdPairValue(Pair[] pairs, String odPairValue) {
        for (Pair pair : pairs) {
            if (pair.od_pair.equals(odPairValue)) return pair;
        }

        throw new NoSuchElementException();
    }

现在,我们有Pair目的。我们可以访问buckets对于这个对象使用

List<BucketObject> buckets = pair.buckets;

其余的处理正在迭代List<BucketObject>并得到想要的值。

希望能帮助到你!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用嵌套对象访问 jsonpath 元素 的相关文章

随机推荐

  • 为什么 O(1) != O(log(n)) ?对于 n=[整数,长整型,...]

    例如 假设 n Integer MAX VALUE 或 2 123 那么 O log n 32 和 123 就是一个小整数 不是 O 1 吗 有什么不同 我认为 原因是 O 1 是常数 但 O log n 不是 还有其他想法吗 If n上面
  • 使用 Gradle 将 .ebextensions 添加到 Spring Boot Jar 的简洁方法

    是否有一种干净的方法可以将其他根文件夹添加到使用默认 bootRepackage jar 生成的 Spring Boot Jar 文件中 就我而言 我需要 AWS beanstalk 的 ebextenions 文件夹 我知道我可以破解它
  • 尝试对值进行分组?

    我有一些这样的数据 1 2 3 4 5 9 2 6 3 7 我正在寻找这样的输出 组 ID 和该组的成员 1 1 2 6 2 3 4 7 3 5 9 第一行 因为 1 连接 到 2 而 2 连接到 6 第二行 因为 3 连接到 4 3 连接
  • Java使Proxy Socket多线程化

    我已经构建了一个 java 代理 它可以工作 但只允许 1 个客户端 我知道我需要进行多线程处理 这就是我这样做的原因 因此它会打开新线程 但由于某种原因我无法让它工作 这是我的代理类 public class Proxy private
  • 升级到 Xcode 5.0 后,Xcode 无法使用所选设备运行

    我今天升级到了xcode 5 0 然后我按下播放键在 iOS 模拟器中运行我的项目 这最初是有效的 然后我决定运行分析器 当我这样做时 我收到消息 Xcode cannot run using the selected device Cho
  • 列表理解中的函数 - 是否多次评估[重复]

    这个问题在这里已经有答案了 哪一个是在 python 中进行列表理解的更好方法 就计算时间和 CPU 周期而言 在示例 1 中 值 f r 是在每次迭代中计算还是计算一次并缓存 y x f r for x in xlist c f r y
  • AWS 无服务器功能未响应图像

    我正在尝试让 AWS API Gateway 使用图像进行响应 我的无服务器 Lambda 代码如下 const express require express const serverless require serverless htt
  • Python 3 中的 io.StringIO 与 open()

    我能找到的就是这个陈述 https docs python org 3 library io html text i o 创建文本流的最简单方法是使用 open 可选 指定编码 f open myfile txt r encoding ut
  • 模板化运算符重载决策,成员函数与非成员函数

    当尝试 clang 3 4 从 gi t 编译 时 它无法编译我的一个项目 抱怨在解决重载运算符时存在歧义 我发现有两个模板化运算符 其中一个被声明为成员函数 另一个被声明为非成员函数 两者看起来同样匹配 下面SSCCE演示了这种情况 in
  • Horizo​​ntalScroll.Value 不会以编程方式设置

    我有一个带有滚动条的面板 并且我经常想以编程方式将控件滚动到视图中 由于不值得一提的原因 我需要自己的方法 经常当我尝试设置时 MyPanel HorizontalScroll Value newScrollValue 价值根本不会接受 我
  • 将数字字符串编码为缩短的字母数字字符串,然后再编码回来

    快问 我正在尝试在 Python 中查找或编写一个编码器 以通过使用大写和小写字母来缩短数字字符串 数字字符串看起来像这样 2012042516160867825914618150402102259146181504021022012042
  • 将应用程序上下文而不是活动上下文传递给视图

    Why use 活动背景虽然我们可以使用应用上下文加载和访问资源 意味着如果我使用应用上下文代替活动背景没有发生异常所以为什么使用活动背景 Example 在下面的例子中 如果我使用获取应用程序上下文 代替 this 活动内的指针onCre
  • 在命令行上向 PHP Unit 发送参数

    我想使用命令行向 PHP 单元发送参数 e g phpunit foo bar AllTests 我怎样才能做到这一点 我最接近实现目标的是使用以下内容
  • 在 Pyyaml 中,如何以块样式表示空字符串和列表?

    我添加了折叠字符串的代表 文字字符串 如中提到的Python 中是否有支持将长字符串转储为块文字或折叠块的 yaml 库 https stackoverflow com questions 6432605 any yaml librarie
  • Instagram API 无法找到有关私人档案的信息

    我的问题非常类似于this https stackoverflow com questions 23600510 instagram api getting feed of private user whom the authorised
  • 用于插件部署的 Eclipse 最小配置

    我现在正在开发eclipse插件 默认的 eclipse 下载包含很多我的插件不需要的插件 它会导致 eclipse 文件夹的大小大于所需的大小 所以我想知道是否有任何方法可以创建这样最小的 Eclipse 配置 以便它能够加载我的插件并且
  • protobuf-net 是否支持可为 null 的类型?

    是否可以在 protobuf net 中生成可为 null 的成员 message ProtoBuf1 optional Int32 databit 1 optional Nullable
  • 如何更改 Android 上文件选择器标题的外观?

    我想显示一个文件选择器来使用以下代码打开图像 Intent intent new Intent intent setType image intent setAction Intent ACTION GET CONTENT startAct
  • iPhone 中出现“无法在设备上上传 *.app”错误

    我在设备上上传应用程序时遇到错误 它确实安装了它 但无法上传它 我还想在设备上运行仪器工具 但当我运行时它什么也没有显示 任何面临同样问题的人 在更改配置文件和应用程序 ID 后 我遇到了这个问题 是什么为我解决了这个问题 退出 XCode
  • 使用嵌套对象访问 jsonpath 元素

    我希望从数组和对象的 JSON 路径中提取某些值 并使用这些值进行进一步处理 并且正在努力访问这些元素 这是 JSON 响应 od pair 7015400 8727100 buckets bucket C00 original 2 ava