我有这样的查询字符串:
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对象。
我已经搜索并阅读了很多问题,但还没有得到正确答案。
告诉我什么可以解决这个问题。
答案 0 :(得分: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,即可完成。
答案 1 :(得分:2)
你真的应该更加具体地了解你所尝试的内容以及它为什么不起作用。
LogObject
的正确代码示例在这里非常有帮助。
理想情况下,您会提供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
所做的那样)。
说到SSCCE,I made one for this answer。
答案 2 :(得分:0)
受@ bruno.braga的启发,这是使用Apache http组件的一种方式。您利用所有解析极端情况:
List<NameValuePair> params =
URLEncodedUtils.parse("http://example.com/?" + queryString, Charset.forName("UTF-8"));
这将为您提供一个易于使用的NameValuePair对象列表。