将 java DTO 列表转换为 JSON 对象

converting java DTO list into JSON object

我有一个这样的 DTO class:

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 + '}';
}

}

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

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

但是当我从客户端获取此对象时,我在解析或字符串化输出时获取的是 dto package/object 名称列表,而不是我从 Java 传递的正确 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 设置的 dto 值获取到客户端 json 而没有如上所述的 java 包名称吗?

您应该覆盖 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

这里是 post 关于使用 GSON 也

How to expose a method using GSon?

首先,您同时使用了 JSON 和 GSON 库,JSONException 存在于 JSON 库中,而 Expose 注释存在于 GSON 中。请确保您不要混合使用它们,因为我不会按预期工作。

其次,来自 Expose 文档

An annotation that indicates this member should be exposed for JSON serialization or deserialization.

This annotation has no effect unless you build Gson with a GsonBuilder and invoke GsonBuilder.excludeFieldsWithoutExposeAnnotation() method.

最后我可以根据@Trynkiewicz Mariusz 和@Paul John 的建议修复它。 我所做的是: 1.去掉@Expose注解 2. 覆盖了 toString(){...} 方法。 3.删除地图实现并使用列表。 4. 使用 gson.toJson(eventList);

这解决了问题,现在的输出如下:

[{
"eventId":167804, "meetingCode":"V5PGB", "meetingName":"SprintValley", "eventTime":"15:38:00", "eventCode":"10:08:00", "category":"HR" }, {
"eventId":167805, "meetingCode":"V5PGB", "meetingName":"SprintValley", "eventTime":"15:50:00", "eventCode":"10:20:00", "category":"HR" },..]

再次感谢大家...