[英]java- unable to map object returned by query to correctly defined class
我有一个必须通过连接到API来获取一些数据的要求。
我已使用以下代码将查询返回的对象映射到哈希图-
untypedResult=wt.QueryPermissions();
resp.getWriter().println(" Response for QueryPermissions----");
if(wt.errormsg=="No Error")
{
hMap = (HashMap<String, Integer>) untypedResult;
Set set = hMap.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry me = (Map.Entry)i.next();
resp.getWriter().println(me.getKey() + " : " + me.getValue());
使用上面的代码返回的输出-
Response for QueryPermissions----
get_all_words_popularity : {keyphrase_limit=999, timeout_limit=99, cost_per_call=99, result_limit=999}
现在,我尝试将响应(在对象中)映射到以下类:
public class wt_queryperm_class {
public Integer keyphrase_limit;
public Integer timeout_limit;
public Integer cost_per_call;
public Integer result_limit;
}
另外,现在我修改了用于显示数据的代码,如下所示-
//declare new object to store result of QueryPermissions
wt_queryperm_class a;
untypedResult=wt.QueryPermissions();
resp.getWriter().println(" Response for QueryPermissions----");
if(wt.errormsg=="No Error")
{
hMap = (HashMap<String, Integer>) untypedResult;
Set set = hMap.entrySet();
Iterator i = set.iterator();
while(i.hasNext()){
Map.Entry me = (Map.Entry)i.next();
a= (wt_queryperm_class)(me.getValue());
resp.getWriter().println(me.getKey() + " : Cost per call=" + a.cost_per_call + "Keyphrase limit=" + a.keyphrase_limit + " Result limit=" + a.result_limit +" Timeout limit=" + a.timeout_limit );
}
但是,当我运行上述代码时,出现以下错误-
Problem accessing /keywords_trial_application. Reason:
java.util.HashMap cannot be cast to com.taurusseo.keywords.wt_queryperm_class
Caused by:
java.lang.ClassCastException: java.util.HashMap cannot be cast to com.taurusseo.keywords.wt_queryperm_class
我在这里做错了什么? 如何正确转换响应,以便可以正确提取4个值中的每一个?
在给出打印内容和错误的情况下,查询结果是Map<String, Map<String, Integer>>
(如果数字存储为Map<String, Map<String, String>>
则为Map<String, Map<String, String>>
)。
该地图只有一个键: "get_all_words_popularity"
。 关联的值包含4个键: "keyphrase_limit"
, "timeout_limit"
, "cost_per_call"
, "result_limit"
。
因此,您的代码应该看起来像这样:
untypedResult = wt.queryPermissions();
resp.getWriter().println(" Response for QueryPermissions----");
if("No Error".equals(wt.errormsg)) {
Map<String, Map<String, Integer> hMap =
(Map<String, Map<String, Integer>) untypedResult;
for (Map.Entry<String, Map<String, Integer>> me : hMap.entrySet()) {
Map<String, Integer> value = me.getValue();
WtQueryPerm perm = new WtQueryPerm(value.get("keyphrase_limit"),
value.get("timeout_limit"),
value.get("cost_per_call"),
value.get("result_limit"));
resp.getWriter().println(me.getKey()
+ " : Cost per call=" + perm.getCostPerCall()
+ ", Keyphrase limit=" + perm.getKeyphraseLimit()
+ ", Result limit=" + perm.getResultLimit()
+ ", Timeout limit=" + perm.getTimeoutLimit());
}
}
注意我的代码
还应了解,强制转换不会神奇地将一个对象转换为另一种对象类型。 它仅允许将类型A的对象引用为另一种类型B,并且仅在该对象有效地是类型B时才起作用(因此B具有A作为祖先或接口)
看起来您想从HashMap填充Bean。 雅加达的Beanutils为此提供了帮助。
wt_queryperm_class bean=new wt_queryperm_class();
BeanUtils.populate(bean, hmap);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.