2017-10-05 6 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."); 
    } 

は、私は受信エラーです:jongoで

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

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を見逃していたかもしれませんが、このアノテーションはmongoオブジェクトIDをクラス内で使用できるようにしますが、それを置かないと '_id'がシーン...: - | –

答えて

0

解決策が見つかりました。

あり、次のようtoJsonメソッドを書き換える必要があるすべてのクラスFlightDTO、HotelDTO、CarDTOプラスIに空のコンストラクタを必要とされている:

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

今はうまくいきます! :)

関連する問題