2015-04-17 304 views
0

我有一個包含動畫列表的Ann類。動漫包含屬性ID,名稱和信息列表。將複雜Java對象映射到Json數組

package entities; 

import javax.xml.bind.annotation.*; 
import java.util.*; 
import javax.ejb.Stateless; 

@Stateless 
@XmlRootElement(name = "ann") 
public class Ann { 

    private List<Anime> Ann = new ArrayList<Anime>(); 

    @XmlElement(name="anime") 
    public List<Anime> getAnn() { 
     return Ann; 
    } 

    public void setAnn(List<Anime> Ann) { 
     this.Ann = Ann; 
    } 

    public Ann() { 
     super(); 
    }} 

我想利用安(動畫對象列表),並將其解析爲JSON來通過GSON被髮送到AJAX使得各個元件可以最終用於/由JavaScript上顯示我的jsp網頁。

我得到它的工作在一定程度上有:

private void returnResults(HttpServletResponse response, String searchQuery) throws IOException{ 

    Map <String, String> map = new HashMap<String, String>(); 

try{ 

    for (Anime anime : annj.Unmarshalling(searchQuery).getAnn()) { 

    map.put("name", anime.getName()); 
    map.put("id", anime.getId()); 

    for (Info temp : anime.getAnime()) { 
     if (temp.getSrc() != null) { 

     map.put("url", temp.getSrc()); 

     } 
    } 

    response.getWriter().write(new Gson().toJson(map)); 

    } 
}catch(Exception e){} 

我將數據發送到:

$(document).ready(function(){ 
    $('#searchForm').submit(function(){ 

     $.ajax({ 
      url: 'search', 
      type: 'POST', 
      dataType: 'text', 
      data: $('#searchForm').serialize(), 
      success: function(data){ 

//    if(data.isValid){ 
//     alert("hi"); 
        $('#displaySearchResults').html("Results:" + data); 
//     $('#displaySearchResults').slideDown(500); 
//    } 
//    else{ 
//     alert('Enter a valid search term.'); 
//    } 
      } 
     }); 
     return false; 
    }); 
}); 

這將產生:

Results:{"name":"Neon Genesis Evangelion: The End of Evangelion","id":"419","url":"http://cdn.animenewsnetwork.com/thumbnails/fit200x200/encyc/A419-28.jpg"}{"name":"Neon Genesis Evangelion: Death \u0026 Rebirth","id":"418","url":"http://cdn.animenewsnetwork.com/thumbnails/fit200x200/encyc/A418-12.jpg"}{"name":"Neon Genesis Evangelion","id":"49","url":"http://cdn.animenewsnetwork.com/thumbnails/fit200x200/encyc/A49-16.jpg"} 

這是偉大的,但它不是」 t是否適當的JSON格式?每個條目之間不應該有逗號?

我這樣做是因爲我讀了你需要你的數據是JSON格式才能在使用javascript/jquery的網頁上顯示它。

最終我希望能夠採取這種搜索結果數據和顯示給用戶與圖片格式的jQuery風格可操作列表。

我的問題是,你能幫我弄清楚如何將數據格式化爲單個正確的JSON字符串嗎?

我花了最後一個小時尋找到加入我的安類toString()方法來嘗試恢復它的屬性,而不是直接訪問各個動漫屬性,像這樣

安類

// @Override 
// public String toString(){ 
//   
//  String masterList = ""; 
//   
//  for (Anime ann : this.Ann){ 
//   
//   masterList = masterList + ann.getName(); 
//    
//  } 
//  return masterList; 
// } 

Servlet的方法

//  try{ 
//   String ann1 = annj.Unmarshalling(searchQuery).getAnn().toString(); 
//    
//   map.put("hi", ann1); 
//    
//   response.getWriter().write(new Gson().toJson(map)); 
//    
//  }catch(Exception e){} 

這似乎並沒有能夠正確地訪問對象的數據,我放棄它,因爲我可以走這小巷永遠和它可能是不必要的。 (在第二個想法看起來相當不錯)但我不知道)

謝謝你的閱讀。

回答

0

您正在綁定打印地圖對象一遍又一遍的響應;那是因爲你看到的地圖印有無逗號。將地圖對象放入ArrayList中並打印出來。它應該工作。

private void returnResults(HttpServletResponse response, String searchQuery) throws IOException{ 

    //arraylist to hold your Mapped String values. 
    ArrayList<Map> arrayOfMap = new ArrayList<Map>(); 
try{ 

for (Anime anime : annj.Unmarshalling(searchQuery).getAnn()) { 
     Map <String, String> map = new HashMap<String, String>(); 
     map.put("name", anime.getName()); 
       map.put("id", anime.getId()); 

       for (Info temp : anime.getAnime()) { 
        if (temp.getSrc() != null) { 

map.put("url", temp.getSrc()); 

    } 
       } 

     //add map to arrayList 
     arrayOfMap.add(map); 


    } 
    //once ready, print all arraylist on response 
    response.getWriter().write(new Gson().toJson(arrayOfMap)); 

    }catch(Exception e){} 

一旦你在客戶端有結果,你可以遍歷JSON來獲取你的數據打印在頁面上;

$.each(data.result, function(listID, mapData){ 
    /* I am assuming you will create Lable for each String in JSON inside your HTML */ 
    $("#displaySearchResults > idLable").text(mapDate.id); 
    $("#displaySearchResults > nameLable").text(mapDate.name); 
    $("#displaySearchResults > urlLable").text(mapDate.url); 

} 
+0

「信息」有相同的「遞歸」問題,但你是對的 – sodik

+0

你是一個絕對的超級明星。非常感謝。讓我的頭部繞過這個映射的東西是不可能的,特別是當我以爲我應該用toString()和像Map >或任何你能想到的東西走到另一條路上。有一次我安裝了Guava for multimaps。我將我的輸出截圖爲http:// imgur。com/q1RiKRc它看起來是正確的(不是我對JSON有任何瞭解),我的下一步將是看我如何使用javascript將元素顯示到我的jsp網頁。 Thankyou – user3474126

+0

不要擔心會繼續進行下去,我將花費接下來的10個小時來查看該教程以使我的前端工作:)我將弄清楚如何接受答案...... – user3474126