5

我试图拉出字符串:

 [{"name":"John Doe Jr."},{"name2":"John Doe"}] & {"name":"John Doe"} 

来自以下 JSON 字符串中的有效负载:

{"to":"broadcast", "type":"50", "payload":[{"name":"John Doe Jr."},{"name2":"John Doe"}]}

{"to":"broadcast", "type":"50", "payload":{"name":"John Doe"}}

使用这个正则表达式代码:

Pattern pattern = Pattern.compile("\\{(.*?)\"payload\":\"(.*?)\"\\}\\}");

Matcher matcher = pattern.matcher(jsonString);

我收到 IllegalStateException: No successfull match so far

我的正则表达式有什么问题?

另外如何获得它找到的匹配数?

任何帮助,将不胜感激。

4

1 回答 1

13

这应该有效:

String someJson ="{\"to\":\"broadcast\", \"type\":\"50\", \"payload\":[{\"name\":\"John Doe Jr.\"},{\"name2\":\"John Doe\"}]}";

Pattern p = Pattern.compile(".*?payload\":(.*)}");
Matcher m = p.matcher(someJson);
if (m.matches()) {
  String payload = m.group(1);
}

之后,有效载荷将具有值[{"name":"John Doe Jr."},{"name2":"John Doe"}] {"name":"John Doe"}

一些注意事项:

  • 此正则表达式仅在有效负载元素是您的 json 字符串中的最后一个 json 对象时才有效。
  • 正如其他人所提到的:使用 json api 执行此操作会更好(也更容易)(见下文)
  • 如果您可以控制 json 字符串,最好返回一个仅包含一个元素的数组,而不是直接返回该元素。所以你不需要编写额外的代码来读取单个元素。

对于 Android JSONObject,这可能如下所示:

JSONObject json = new JSONObject(someJson);
try {
  JSONArray payload = json.getJSONArray("payload");
} catch (Exception e) {
  // array conversion can fail for single object 
  JSONObject payload = json.getJSONObject("payload");
}
于 2012-08-25T17:18:38.137 回答