【问题标题】:Refactoring code for fetching JSON path to improve performance and readablilty重构用于获取 JSON 路径的代码以提高性能和可读性
【发布时间】:2017-11-06 19:15:17
【问题描述】:

我重复调用以下代码以从 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 作为参数传递给同一方法,并返回一个字符串?

【问题讨论】:

    标签: java json refactoring


    【解决方案1】:

    尽管您可能需要对其进行测试,但这样的方法应该可以工作。这无法编译,因为我没有您的应用程序的完整上下文,但您可以复制相关代码进行测试。

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

    【讨论】:

      【解决方案2】:

      如果我理解你的话......

      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-10
        • 1970-01-01
        • 2010-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多