2015-04-17 305 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