我以字符串形式从服务器获得以下响应...
value_one=3342342&value_two=456344445&value_three=235333223
解析此问题的有效方法是什么?我能想到的一切都非常混乱。
答案 0 :(得分:6)
拆分'&',循环,拆分'='
public static Map<String, String> getQueryMap(String query)
{
String[] params = query.split("&");
Map<String, String> map = new HashMap<String, String>();
for (String param : params)
{
String name = param.split("=")[0];
String value = param.split("=")[1];
map.put(name, value);
}
return map;
}
答案 1 :(得分:1)
如果您打算解析多个字符串,那么重复使用String.split()
方法不是一个好主意,因为它每次都会重新编译拆分正则表达式。
Pattern ampPattern = Pattern.compile("&");
Pattern eqPattern = Pattern.compile("=");
...
Map<String, Long> results = new HashMap<String, Long>();
for (String param : ampPattern.split(input)) {
String[] pair = eqPattern.split(param);
results.put(pair[0], Long.valueOf(pair[1]));
}
但是对于这样一个简单的输入字符串,根本不使用regexp会更有效,并且避免创建临时String数组。也许是这样的:
Map<String, Long> results = new HashMap<String, Long>();
int start = 0;
int next;
do {
next = input.indexOf('&', start);
int end = next == -1 ? input.length() : next;
int k = input.indexOf('=', start);
results.put(input.substring(start, k), Long.valueOf(input.substring(k + 1, end)));
start = next + 1;
} while (next > -1);
当然,如果你只解析几次这个字符串,那么这样的优化可能不值得。
答案 2 :(得分:0)
首先将字符串拆分为“&amp;”。这将为您提供标记,每个标记由一个名称和值对组成,其中“=”将它们分开。因此,根据需要将它们分成“=”。除非你有其他要求,否则对我来说似乎很简单。
答案 3 :(得分:0)
一种天真的方法就是使用String.split:
String input = "value_one=3342342&value_two=456344445&value_three=235333223"
String[] rawAttrs = input.split("&");
// Split each attribute into pairs - assume some sort of Pair class exists
List<Pair<String, String>> attributes = new ArrayList<Pair<String, String>>();
for (String rawAttr : rawAttrs) {
String[] parts = rawAttrs.split("=");
attributes.add(new Pair<String, String>(parts[0], parts[1]);
}
此方法不能很好地处理格式错误的条目 - 但更重要的是,如果部分属性值包含=
或&
字符,则不会考虑会发生什么。这些反斜杠是逃脱的吗?它们是否经过URL编码?还有其他一些方法可以嵌入它们吗?
如果你可以保证这些值是整数,那么这不会有问题,但是你需要确保覆盖所有的基础。