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

时间:2017-11-06 19:15:18

标签: java json refactoring

我重复调用以下代码以从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 个答案:

答案 0 :(得分:0)

虽然您可能需要测试,但这样的事情应该可行。这不会编译,因为我没有应用程序的完整上下文,但您可以复制相关代码进行测试。

   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();
    }

答案 1 :(得分:0)

如果我理解你......

prog.cc: In instantiation of 'void doSmth(T) [with T = int]':
prog.cc:17:13:   required from here
prog.cc:8:5: error: 'int' is not a class, struct, or union type
     if constexpr (requires { typename T::Bar; })
     ^~

现在你需要一个你的网址数组,例如在集合中。

public String getValue(JsonArray array, int index) {

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

}


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

现在使用此

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