将复杂的Java Object映射到Json Array

时间:2015-04-17 17:43:11

标签: java arrays json object

我有一个包含动画列表的Ann类。动漫包含属性id,名称和信息列表。

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

我想拿Ann(动画对象列表)并将其解析为Json,由Gson发送到ajax,以便最终可以通过jsp在我的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"}

这很棒,但它不适合JSON格式吗?每个条目之间不应该有逗号吗?

我这样做是因为我读到您需要使用JSON格式的数据,以便使用javascript / jquery在网页上显示它。

最终我希望能够获取此搜索结果数据并以图片格式的jquery样式可操作列表显示给用户。

我的问题是,你能帮我弄清楚如何将数据格式化为一个正确的JSON字符串吗?

我花了最后一小时考虑在我的Ann类中添加一个toString()方法,试图直接返回它的属性而不是访问单独的Anime属性,就像这样

Ann class

//    @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){} 

这似乎无法正确访问对象数据,因为我可以永远沿着那条小巷走下去而且它可能是不必要的。 (根据第二个想法,它看起来相当不错......但我不知道)

谢谢你的阅读。

1 个答案:

答案 0 :(得分:0)

你想要一次又一次地打印Map对象而不是响应;这就是因为你看到地图打印时没有逗号。将地图对象放在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);

}