Java解析Json文件行以返回该行的一部分

时间:2018-12-03 14:40:02

标签: java json parsing

我在尝试弄清楚如何解析json文件中的一行时遇到了一些麻烦,因此它仅将行的一部分作为字符串返回。我将在下面说明:

public String GetDistance(String origin, String destination) throws MalformedURLException, IOException {

    //URL url = new URL("https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins" + origin + ",UK+destination=" + destination + ",UK&key=mykey");
    URL url = new URL("https://maps.googleapis.com/maps/api/distancematrix/json?units=imperial&origins=Cornwall,UK&destinations=London,UK&key=mykey");
    HttpURLConnection conn = (HttpURLConnection) url.openConnection();
    conn.setRequestMethod("GET");
    String line, outputString = "";
    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
    while ((line = reader.readLine()) != null) {

        if (line.contains("distance")) {
            outputString = reader.readLine().trim();

            return outputString;
        }

    }

    return outputString;
}

此功能的作用是使用Google Maps API在浏览器中创建一个json文件:

{
   "destination_addresses" : [ "London, UK" ],
   "origin_addresses" : [ "Cornwall, UK" ],
   "rows" : [
      {
         "elements" : [
            {
               "distance" : {
                  "text" : "284 mi",
                  "value" : 456443
               },
               "duration" : {
                  "text" : "4 hours 52 mins",
                  "value" : 17530
               },
               "status" : "OK"
            }
         ]
      }
   ],
   "status" : "OK"
}

当前,“ outputString”返回以下行:“ text”:“ 284 mi”。但是,所需的输出只是返回里程“ 284”。

我知道这很可能是转贴,但是我一直在寻找解决方案,但未能成功实现。

在此方面提供的任何帮助将非常感谢,干杯。

1 个答案:

答案 0 :(得分:0)

您可以有2种解决方案:

  1. 解析JSON并将其作为对象,然后仅返回您要查找的String。

  2. 按如下所示分割行:

    outputString = reader.readLine().trim();
    

    上面的那行返回“ text”:“ 284 mi”

    然后您需要用:分隔行:

    outputString.split(":")
    

    应该创建一个包含2个字符串的数组:"text""284 mi"

    然后获取第二个String并将其分隔为空格并获取第一个String:

    outputString.split("\\s")
    

    现在您拥有:"284

    然后将其从子索引1返回到结尾,请参见docs

    outputString.substring(1)
    

    然后将它们放在一起:

    return outputString.split(":")[1].split("\\s")[0].substring(1)
    

我还没有尝试上面的代码,但是应该可以。

顺便说一句,跟随Java Naming Conventions

  • firstWordLowerCaseVariable
  • firstWordLowerCaseMethod()
  • FirstWordUpperCaseClass
  • ALL_WORDS_UPPER_CASE_CONSTANT

并持续使用它们