繁体   English   中英

java-无法将查询返回的对象映射到正确定义的类

[英]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());

    }
}

注意我的代码

  • 遵守Java命名约定
  • 始终使用通用类型,避免强制转换和编译警告
  • 不会将字符串与==进行比较,而是使用等号,因为==仅比较引用而不是值。
  • 仅在需要时才声明可能具有较小范围的变量。
  • 使用getter访问构造对象的状态。

还应了解,强制转换不会神奇地将一个对象转换为另一种对象类型。 它仅允许将类型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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM