解析此数据格式

时间:2013-07-12 19:45:34

标签: java string

除了字符串匹配之外,还有一种更简单的方法来解析下面的字符串吗? :

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23
    [name=Sprint 1,
     closed=true,
     startDate=2013-04-10T17:58:49.228-07:00,
     endDate=2013-04-24T17:58:49.228-07:00,
     completeDate=2013-04-16T14:42:09.504-07:00,id=10]

我有兴趣获取nameclosed和其他此类值。

(这个字符串是JSONArray的一个元素,类型为org.codehaus.jettison.json.JSONArray,我是从JIRA获得的。)

4 个答案:

答案 0 :(得分:3)

这就是我这样做的方式,它是可读的,不涉及正则表达式。

String keyValue = str.substring(str.indexOf("[") + 1, str.lastIndexOf("]"));
StringTokenizer tok = new StringTokenizer(keyValue, ",");
Map<String, String> map = new LinkedHashMap<String, String>();
while (tok.hasMoreTokens()) {
    String entString = tok.nextToken();
    map.put(entString.split("=")[0], entString.split("=")[1]);
}

从这一点开始,我通过

获得了我需要的价值
map.get("name")

答案 1 :(得分:1)

因此,这可能不是有效的JSON,但如果表单每次都相同(就没有额外的嵌套级别而言),它应该可以通过正则表达式进行解析。

首先使用此正则表达式\[(.*)\]捕获数组,中间的组将是数据。然后在,上拆分该数据。现在你有一个数组,每个条目都可以通过你选择的正则表达式轻松解析,除非条目遵循你没有告诉我们的某种形式,或者我没有抓住,每个条目都需要它自己的特定正则表达式哪个应该比较容易写。

另外我不确定这部分是否在开头

  

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23

是重要数据,但也可以由另一个正则表达式进行解析

  

解决方案2

因此,另一个解决方案使用2个正则表达式操作将字符串转换为有效的JSON。

首先String result = searchText.replaceAll("(.|\\n)*(\\[(.|\\n)*\\])", "$1");'\

这基本上只是从正面删除那个大字符串。

下一步

result = searchText.replaceAll("(\\w*)=([^,\\]]*)", "\"$1\" : \"$2\"");

这个正则表达式只是修复了数组以使其成为有效的JSON数组,现在您可以在字符串上使用JSON解析器。至于在你的解决方案中没有使用正则表达式,我说为什么不,正则表达式是编程中一些人使用它们的最具表现力的工具之一,但这是一个使用它的完美案例

答案 2 :(得分:1)

你从哪里得到这个字符串?此输出看起来非常像toString()实现。你有这个JSONArray对象的引用吗?如果是这样的话:

API表示该对象提供了诸如getString(int index)

之类的方法

因此sprintObject.getString(0)应该返回Sprint 1

答案 3 :(得分:0)

我想你可以使用正则表达式来匹配'='和','之间的出现,假设你知道属性名称,封闭等总是按顺序存在,并且它们不包括'=',','和'''在他们的价值观中。

Pattern p = Pattern.compile("=.*?[,\\]]");
List<String> matches = new ArrayList<String>();
Matcher matcher = p.matcher(value);
while(matcher.find()) {
    matches.add(matcher.group(0));
}

com.atlassian.greenhopper.service.sprint.Sprint@719c9e23 [name = Sprint 1,closed = true,startDate = 2013-04-10T17:58:49.228-07:00,endDate = 2013-04-24T17: 58:49.228-07:00,completeDate = 2013-04-16T14:42:09.504-07:00,ID = 10]

根据您的示例匹配,现在将包含以下字符串:

  • name = Sprint 1,
  • 关闭= true,
  • 的startDate = 2013-04-10T17:58:49.228-07:00,
  • 结束日期= 2013-04-24T17:58:49.228-07:00,
  • completeDate = 2013-04-16T14:42:09.504-07:00,
  • ID = 10]

我猜你可以从这里拿走它。

编辑:正则表达式是一种好方法,这种数据格式看起来很像

之类的返回值
public String toString() {
    return super.toString() + ... ;
}

此外,第二个想法,如果确实没有其他选项而不是解析这种格式,我会明确匹配属性,例如使用正则表达式“name =。*?,”作为名称