【问题标题】:Get field from json using regex使用正则表达式从 json 获取字段
【发布时间】:2018-05-23 10:45:54
【问题描述】:

我有以下 json 文档:

{  
   "videoUrl":"",
   "available":"true",
   "movie":{  
      "videoUrl":"http..."
   },
   "account":{  
      "videoUrl":"http...",
      "login":"",
      "password":""
   }
}   

在这个 json 中我有一个名为 videoUrl 的属性,我想获取第一个非空的 videoUrl

我的正则表达式:

("videoUrl":)("http.+")

但是这个正则表达式匹配下面的字符串

    "videoUrl" :"http..."},
"account" : {"videoUrl" : "http...","login" : "","password" : ""

我写正则表达式的方法是什么,它将找到第一个非空 videoUrl 的值

(结果应该是"videoUrl":"http..."

【问题讨论】:

  • 我认为你不需要任何正则表达式,只需要 json 解析和逻辑
  • 尝试在表达式末尾添加\s(空格)。
  • @JanOssowski 感谢回复,我补充了,但还是不正确
  • @B001ᛦ 问题是我在乞讨中没有我的 json,我解析了包含这个 json 作为代码一部分的 .js 脚本
  • 通过正则表达式解析 json 不是一个好主意。你能试试jsonPath吗? github.com/json-path/JsonPath

标签: java regex string


【解决方案1】:

在正则表达式的末尾添加(?!,),它将使正则表达式停止在, 处而不捕获它:

public static void main(String[] args) {
    String input = "{  \n" +
            "   \"videoUrl\":\"\",\n" +
            "   \"available\":\"true\",\n" +
            "   \"movie\":{  \n" +
            "      \"videoUrl\":\"http...\"\n" +
            "   },\n" +
            "   \"account\":{  \n" +
            "      \"videoUrl\":\"http...\",\n" +
            "      \"login\":\"\",\n" +
            "      \"password\":\"\"\n" +
            "   }\n" +
            "} ";

    Pattern pattern = Pattern.compile("(\"videoUrl\":)(\"http.+\")(?!,)");
    Matcher matcher = pattern.matcher(input);
    while (matcher.find()) {
        System.out.println(matcher.group());  // "videoUrl":"http..."
    }
}

【讨论】:

    【解决方案2】:

    使用 JSON 解析器之一会更合适,例如 Gson 或 Jackson,而不是正则表达式。比如:

    String jsonStr = "...";
    Gson gson = new Gson();
    JsonObject json = gson.fromJson(jsonStr, JsonObject.class);
    String url = element.get("videoUrl").getAsString();
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-12
      • 1970-01-01
      • 2019-12-19
      • 1970-01-01
      相关资源
      最近更新 更多