将查询字符串参数解析为Java对象

3

I have query string like that:

ObjectGUId=1abcde&ObjectType=2&ObjectTitle=maximumoflife&Content=racroi&TimeStamp=2012-11-05T17:20:06.056

我有一个Java对象:

LogObject{
    private String ObjectGUId;
    private String ObjectType;
    private String ObjectTitle;
    private String Content;
    private String TimeStamp;
}

我希望将这个查询字符串解析为Java对象。

我已经搜索和阅读了许多问题,但尚未得到正确的答案。

请告诉我可以解决这个问题的方法。


“告诉我什么可以解决这个问题。”哇,非常命令式。你到目前为止尝试了什么? - tckmn
此外,LogObject 就是这样的吗?如果是的话,在其中设置任何值都会相当困难... - Iskar Jarak
3个回答

4

受@bruno.braga的启发,这里介绍一种使用Apache http-components的方法。您可以利用所有解析角落案例:

List<NameValuePair> params = 
    URLEncodedUtils.parse("http://example.com/?" + queryString, Charset.forName("UTF-8"));

那会给你一个NameValuePair对象列表,很容易处理。

3

如果您不是非常需要将查询字符串推入自己的类(尽管您可能希望这样做),而不是手动解析它,您可以使用URLDecoder,如@Sonrobby所评论的:

String qString = "ObjectGUId=1abcde&ObjectType=2&ObjectTitle=maximumoflife";
Uri uri = Uri.parse(URLDecoder.decode("http://dummy/?" + qString, "UTF-8"));
if (uri != null) {
    for(String key: uri.getQueryParameterNames()) {
        System.out.println("key=[" + key + "], value=[" + uri.getQueryParameter(key) + "]");
    }
}            

如果你只有查询字符串值(qString),那么“dummy”看起来很脏,但是它是必需的。如果你有完整的URL,只需直接将其传递给URLDecoder,就可以完成。


2
我认为 getQueryParameterNames() 可能在 Android 中,但不在 Java 中。 - jokeyrhyme
你只需要在查询字符串前面添加“?”就可以正确解析它。 - Kong

2

礼仪

  1. 你应该更具体地说明你尝试过什么以及为什么不起作用。

  2. 你的LogObject的正确代码示例将非常有帮助。

  3. 最好提供一个SSCCE,这样其他人可以轻松地测试你的问题。

回答

你可以像这样提取名称:值对:

String toParse = "ObjectGUId=1abcde&ObjectType=2&ObjectTitle=maximumoflife&Content=racroi&TimeStamp=2012-11-05T17:20:06.056";
String[] fields = toParse.split("&");
String[] kv;

HashMap<String, String> things = new HashMap<String, String>();


for (int i = 0; i < fields.length; ++i)
{
    t = fields[i].split("=");
    if (2 == kv.length)
    {
        things.put(kv[0], kv[1]); 
    }
}

我选择将它们放入HashMap中,但你也可以轻松地查看名称部分(kv[0])并选择对其进行某些操作。例如:

if kv[0].equals("ObjectGUId")
{
    logObject.setGUId(kv[1]); // example mutator/setter method
}
else if //...

然而,LogObject 中所有字段都是私有的,并且你没有展示任何方法,所以我希望你有一种从外部设置它们的方式...请记住,如果你打算在构造函数调用之后设置字段,那么你需要将这些键值对存储在某种数据结构中(就像我使用 HashMap 一样),如果你想使用所有字段初始化一个 LogObject

说到 SSCCEs,我为这个答案制作了一个


好的,看起来很不错。所以URL查询字符串始终为UTF-8编码。还有什么需要注意的吗? - Sonrobby
因此,URL查询字符串始终以utf-8编码。因此,可以使用以下代码:private static String urlDecode (String s) { try { return URLDecoder.decode(s, "UTF-8"); } catch (UnsupportedEncodingException e) { throw new RuntimeException("Error in urlDecode.", e); } } - Sonrobby
没问题。如果你可以接受抛出运行时异常并(可能)导致程序崩溃,那就可以这样做。 - Iskar Jarak
每个Java的实现都需要支持UTF-8编码,并且该编码是作为一个常量给出的,因此在这里抛出运行时异常是正确的。 - fgb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接