将java DTO列表转换为JSON对象

时间:2015-02-28 18:03:04

标签: java javascript jquery json gson

我有这样的DTO课程:

package stbet.model.dto.db;

public class UKDashboardEventDTO implements Serializable{

private Long eventId;
private String meetingCode;
private String meetingName;
private String eventTime;
private String eventCode;
private String settleStatus;
private String category;

//getters and setters here:

@Override
public String toString() {
    return "eventList{" + "eventId=" + eventId + ", meetingCode=" + meetingCode + ", meetingName=" + meetingName
            + "eventTime=" + eventTime + ", eventCode=" + eventCode + ", settleStatus=" + settleStatus
            + ", category=" + category + '}';
}

}

我做了一些查询,并创建了一个上面DTO类型的java列表。

                   for(Event ev : eventList){
                        dto = new UKDashboardEventDTO();
                        // some stuff
                        dto.setEventCode(ev.getEventCode());
                        dto.setEventId(ev.getId());
                        dto.setEventTime(ev.getEventTime());
                        dto.setMeetingName(ev.getMeeting().getMeetingName());
                        dto.setMeetingCode(ev.getMeeting().getMeetingCode());

                        eventDTOList.add(dto);    
                    }

然后我将此列表添加到Hashmap中并将其转换为JSON对象,如下所示:

Map map = new HashMap();
map.put("eventList",eventDTOList);

现在转换为json:

   JSONObject obj = new JSONObject();
        try {
            obj.put("eventMap", map);

        } catch (JSONException ex) {
        }
        out.println(obj);
        out.flush();
        out.close();

但是当我从客户端获取此对象时,我在解析或字符串化输出而不是从Java传递的正确dto值时获取dto包/对象名称列表。我得到的是:

"{"eventMap":{"eventList":["stbet.model.dto.db.UKDashboardEventDTO@617538bb","stbet.model.dto.db.UKDashboardEventDTO@56dfaef9","stbet.model.dto.db.UKDashboardEventDTO@775889fd","stbet.model.dto.db.UKDashboardEventDTO@55cb7e41","stbet.model.dto.db.UKDashboardEventDTO@22ce0968","stbet.model.dto.db.UKDashboardEventDTO@4cb9cb2"]}}"

请告诉我如何获取我从Java设置到客户端json的dto值,如上所述没有java包名。

3 个答案:

答案 0 :(得分:1)

您应该覆盖DTO上的toString字段,以打印出所有单个字段值。 当你执行out.println(obj);

时,将调用此toString

例如

toString() {
 // this method should list out all the attributes.
 }

您应该使用GSONBuilder来创建gson。例子: Gson: How to exclude specific fields from Serialization without annotations

Gson doesn't parse an exposed field

以下是关于使用GSON的帖子

How to expose a method using GSon?

答案 1 :(得分:1)

首先,您同时使用JSON和GSON库,{1}}存在于JSON 1中,JSONException注释存在于GSON中。因为我不能按预期工作,所以请确保你不要混合它们。

其次,来自Expose文档

  

一个注释,指示应该公开此成员以进行JSON序列化或反序列化。

     

除非您使用GsonBuilder构建Gson并调用GsonBuilder.excludeFieldsWithoutExposeAnnotation()方法,否则此注释无效。

答案 2 :(得分:0)

最后,我可以用你的建议解决它@Trynkiewicz Mariusz和@Paul John。 我做的是: 1.删​​除@Expose注释 2.重写toString(){...}方法。 3.删除地图实现并使用List。 4.使用gson.toJson(eventList);

这解决了问题,输出现在就像:

[{
      “事件ID”:167804,       “meetingCode”: “V5PGB”       “meetingName”: “SprintValley”       “EVENTTIME”: “15:38:00”,       “EVENTCODE”: “10:08:00”,       “类别”: “HR”    },    {
      “事件ID”:167805,       “meetingCode”: “V5PGB”       “meetingName”: “SprintValley”       “EVENTTIME”: “15:50:00”,       “EVENTCODE”: “10:20:00”,       “类别”: “HR”    },..]

再次感谢你们......