2

我有这样的查询字符串:

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 对象。

我已经搜索并阅读了很多问题,但还没有得到正确的答案。

告诉我什么可以解决这个问题。

4

3 回答 3

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),则它是必需的。如果您有完整的 URL,只需将其直接传递给 URLDecoder,即可完成。

于 2013-10-15T01:08:49.400 回答
3

受@bruno.braga 启发,这是一种使用 Apache http-components 的方法。您利用所有解析极端情况:

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

这将为您提供一个应该易于使用的 NameValuePair 对象列表。

于 2017-09-08T10:09:50.753 回答
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都是私有的,并且您没有向我们展示任何方法,所以我希望您有一些从外部设置它们的方法......请记住,您需要将这些对存储在某种数据结构中(就像我对 a 所做的那样HashMap)如果您打算LogObject用所有字段初始化 a 而不是在构造函数调用之后设置字段。

说到 SSCCE,我为这个答案做了一个

于 2012-11-08T03:29:06.453 回答