当前位置: 首页 > 知识库问答 >
问题:

重构获取JSON路径的代码以提高性能和可读性

燕鸿波
2023-03-14

我反复调用以下代码,以从JSON响应中获取某些字符串值。

String val1 = JsonPath.with(e.getValue()).getAsJsonArray("val1/textSpans")
                .get(0).getAsJsonObject().get("text").getAsString();

String val2 = JsonPath.with(e.getValue()).getAsJsonArray("val2/textSpans")
                .get(0).getAsJsonObject().get("text").getAsString();

String val3 = JsonPath.with(e.getValue()).getAsJsonArray("val3/textSpans")
                .get(0).getAsJsonObject().get("text").getAsString();

String val4 = JsonPath.with(e.getValue()).getAsJsonArray("val4/textSpans")
                .get(0).getAsJsonObject().get("text").getAsString();

将其重构如下是否有意义,还是过度杀戮:

JsonPath path = JsonPath.with(e.getValue());
String val1 = path.getAsJsonArray("val1/textSpans")
                    .get(0).getAsJsonObject().get("text").getAsString();
String val2 = path.getAsJsonArray("val2/textSpans")
                    .get(0).getAsJsonObject().get("text").getAsString();
String val3 = path.getAsJsonArray("val3/textSpans")
                    .get(0).getAsJsonObject().get("text").getAsString();
String val4 = path.getAsJsonArray("val4/textSpans")
                    .get(0).getAsJsonObject().get("text").getAsString();

是否可以进一步重构,以便val1、val2、val3和val4作为参数传递给同一方法,并返回一个String?

共有2个答案

冯星剑
2023-03-14

如果我不理解你。。。

public String getValue(JsonArray array, int index) {

    return array.get(index).getAsJsonObject().get("text").getAsString();

}


getValue(path.getAsJsonArray("val1/textSpans"), 0);

现在,您需要url的数组,例如在集合中。

List<String> urls = new ArralyList()<>;
urls.add("val1/textSpans");
urls.add("val2/textSpans");
urls.add("val3/textSpans");
urls.add("val4/textSpans");

现在用这个

StringBuilder values = new StringBuilder();

for (int i = 0; i < urls.size() - 1; i++) {
   values.append(getValue(path.getAsJsonArray(urls.get(i)), 0));
}
白吕恭
2023-03-14

虽然您可能需要对其进行测试,但类似的操作应该可以正常工作。这无法编译,因为我没有应用程序的完整上下文,但您可以复制相关代码来测试它。

   public static void main(String[] args) throws Exception {

        JsonPath path = JsonPath.with(e.getValue());

        List<String> values = new ArrayList<String>();

        for (int i = 1; i < 5; i++) {
            values.add(getPath("val" + i, path));
        }
    }

    static String getPath(String value, JsonPath path) {
        return path.getAsJsonArray(value + "/textSpans")
                .get(0).getAsJsonObject().get("text").getAsString();
    }
 类似资料:
  • 我有一个cron作业方法,它根据用户的特色故事构建用户的故事提要,跟踪类别并跟踪用户。 最终提要按正确顺序添加到以下数据库表中: 用户提要表: Uid 方法如下,包含注释<代码: 对于30名用户,上述方法需要约35秒才能完成<问:我如何改进代码和性能?

  • 将近200个nio线程处于相同的状态。可以做什么来使它的代码更可伸缩性,这样我们将获得更高的吞吐量。

  • 问题内容: 我正在使用JSON文件自动填充下拉列表。它绝非庞大(3000行且正在增长),但是刷新页面所花费的时间变得非常明显。 首次加载页面时,将读取JSON,具体取决于用户选择了哪个选项,从而决定了使用JSON的哪一部分来填充下拉列表。 然后将其加载到每次刷新或菜单选择之后。是否可能以某种方式缓存值以防止需要一次又一次地重新加载它? 谢谢。 编辑:更多信息:它本质上是一个单位转换器。JSON包含

  • 问题内容: Kotlin是否可以提高性能?有基准测试吗?Kotlin比Java快吗?我在Kotlin网站上找到了这个。https://kotlinlang.org/docs/reference/comparison- to-java.html 谈论语言功能而不是性能。 问题答案: Kotlin生成的字节码与Java非常相似,因此Kotlin代码的性能在大多数情况下与等效Java代码的性能相同。 内

  • 问题内容: JSON Path Expression应该是什么来获取beneficiary_ids 问题答案: 您所需的JSON路径表达式将如下所示:

  • 在花了相当长的时间在多个程序上之后,我发现,根据平台的不同,我有时需要大幅降低RAM使用率,因为某些平台上的资源非常有限。我通常按照这些类型存储大型映射和矩阵,因此从int32切换到int16或从float切换到double(如果它们实际上大小不同)可以轻松地将使用量减少近一半。因此,我刚刚添加了如下重新定义: 这使我能够快速调整程序中所有重要的基元类型。请注意,程序中的整数实际上都没有超过2字节