2017-10-05 78 views
-1

我有一个类包含其他类的其他一些属性,当我尝试从JSON转换到我的类时,显示一个错误。将JSON映射到类不工作

这是我的课:

import org.jongo.marshall.jackson.oid.MongoObjectId; 
import org.json.JSONObject; 

import java.util.List; 

public class BusinessTravelDTO { 
    @MongoObjectId 
    private String id; 

    private String travelerId; 

    private BusinessTravelStatus status; 

    List<FlightDTO> flights; 

    List<HotelDTO> hotels; 

    List<CarDTO> cars; 

    public BusinessTravelDTO() { } 

    public BusinessTravelDTO(JSONObject data) { 
    this.travelerId = data.getString("travelerId"); 
    this.status = BusinessTravelStatus.valueOf(data.getString("status")); 
    this.flights = HandlerUtil.getInputFlights(data.getJSONArray("flights")); 
    this.hotels = HandlerUtil.getInputHotels(data.getJSONArray("hotels")); 
    this.cars = HandlerUtil.getInputCars(data.getJSONArray("cars")); 
    } 

    public JSONObject toJson() { 
    return new JSONObject() 
      .put("id", this.id) 
      .put("travelerId", this.travelerId) 
      .put("status", this.status) 
      .put("flights", this.flights) 
      .put("hotels", this.hotels) 
      .put("cars", this.cars); 
    } 

而且这里是我尝试转换为等级:

public static JSONObject acceptBusinessTravel(JSONObject input) { 
    String btId = getStringField(input, "id"); 
    MongoCollection businessTravels = getBTCollection(); 

    // Here is the problem... 
    BusinessTravelDTO bt = businessTravels.findOne(new ObjectId(btId)).as(BusinessTravelDTO.class); 
    bt.setStatus(BusinessTravelStatus.Accepted); 

    businessTravels.save(bt); 

    return new JSONObject().put("message", "The business travel has been ACCEPTED by your manager. Check your email."); 
    } 

这是我收到的错误:

"error": "org.jongo.marshall.MarshallingException: Unable to unmarshall result to class path.data.BusinessTravelDTO from content { \"_id\" : { \"$oid\" : \"59d6905411d58632fd5bd8a5\"} , \"travelerId\" 

在jongo docs指定类应该有一个空的构造函数... http://jongo.org/#mapping我有2个构造函数,我也试过了与@JsonCreator,但没有成功... :(
你有一个想法,为什么它不转换?它可能是与BusinesTravelDTO中的字段相关的,例如List CarDTO for ex?

+0

JSON文本似乎有一个带'$ oid'字段的'_id'字段,而您的'BusinessTravelDTO'有'String'类型的'id'字段。你是如何期望这项工作的? ---虽然我有点困惑,因为我看不到你在做编组的代码。向我们展示'acceptBusinessTravel()'方法有什么意义? – Andreas

+0

http://idownvotedbecau.se/noexceptiondetails/ – Andreas

+0

@Andreas也许你错过了@MongoObjectId,这个annotation允许你在类中使用mongo对象id,但是如果你不这样做,'_id'是无论如何创建的场景...: - | –

回答

0

我终于找到了解决方案;

有需要一个空的构造中的所有类FlightDTO,HotelDTO,CarDTO再加上我应该重写的toJSON方法如下:

public JSONObject toJson() { 
    JSONObject obj = new JSONObject().put("id", this.id).put("travelerId", this.travelerId).put("status", this.status); 

    if (flights != null) { 
     JSONArray flightArray = new JSONArray(); 
     for (int i = 0; i < flights.size(); ++i) { 
     flightArray.put(flights.get(i).toJson()); 
     } 
     obj.put("flights", flightArray); 
    } 

    if (hotels != null) { 
     JSONArray hotelArray = new JSONArray(); 
     for (int i = 0; i < hotels.size(); ++i) { 
     hotelArray.put(hotels.get(i).toJson()); 
     } 
     obj.put("hotels", hotelArray); 
    } 

    if (cars != null) { 
     JSONArray carArray = new JSONArray(); 
     for (int i = 0; i < cars.size(); ++i) { 
     carArray.put(cars.get(i).toJson()); 
     } 
     obj.put("cars", carArray); 
    } 
    return obj; 
    } 

这是FlightDTO;

public class FlightDTO { 
    @MongoObjectId 
    private String id; 

    private String departure; 
    private String arrival; 
    private String airline; 
    private Double price; 

    public FlightDTO() { 
    } 

    public FlightDTO(JSONObject data) { 
    this.departure = data.getString("departure"); 
    this.arrival = data.getString("arrival"); 
    this.airline = data.getString("airline"); 
    this.price = data.getDouble("price"); 
    } 

    public JSONObject toJson() { 
    return new JSONObject() 
      .put("id", this.id) 
      .put("departure", this.departure) 
      .put("arrival", this.arrival) 
      .put("airline", this.airline) 
      .put("price", this.price); 
    } 
} 

现在效果很好! :)