2011-11-06 2 views
0

APIに接続してデータを取得する必要があるという要件があります。コード上に使用して返されるjava-クエリによって返されたオブジェクトを正しく定義されたクラスにマップすることができません

Iは、以下code--

 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); 
      } 

below--示すように、私は上記のcode--を実行したとき、私は

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つの値のそれぞれを正しく抽出できるようにするにはどうすればよいですか?

答えて

1

何が印刷され、何かエラーがあった場合、クエリの結果はMap<String, Map<String, Integer>>(または数値が文字列として格納されている場合はMap<String, Map<String, String>>)です。

マップには、単一のキー:"get_all_words_popularity"があります。関連するvaludには、"keyphrase_limit","timeout_limit""cost_per_call""result_limit"の4つのキーが含まれています。

だからあなたのコードではなく、次のようになります。

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の命名規則
  • は==の文字列を比較しませんが、==は参照のみを比較し値は比較しないためequalsを使用します。
  • 必要な場合にのみ、可能な限り小さなスコープで変数を宣言します。
  • getterを使用して、構築されたオブジェクトの状態にアクセスします。

また、キャストはオブジェクトを魔法のように別のオブジェクトタイプに変換しないことも理解しています。これは、タイプAのオブジェクトを別のタイプBとして参照することを許可し、オブジェクトが事実上タイプBである場合にのみ機能します(したがって、Bは祖先またはインタフェースとしてAを持ちます)

+0

ありがとう、あなたは答えが非常に明るいです! – Arvind

0

HashMap。ジャカルタのBeanutilsにはこのための助けがあります。

wt_queryperm_class bean=new wt_queryperm_class(); 
BeanUtils.populate(bean, hmap); 
関連する問題