Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将JSON映射到类不起作用_Java_Json_Mongodb_Jackson_Jongo - Fatal编程技术网

Java 将JSON映射到类不起作用

Java 将JSON映射到类不起作用,java,json,mongodb,jackson,jongo,Java,Json,Mongodb,Jackson,Jongo,我有一个包含其他类的其他属性的类,当我尝试从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 trave

我有一个包含其他类的其他属性的类,当我尝试从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);
  }
以下是我收到的错误:

"error": "org.jongo.marshall.MarshallingException: Unable to unmarshall result to class path.data.BusinessTravelDTO from content { \"_id\" : { \"$oid\" : \"59d6905411d58632fd5bd8a5\"} , \"travelerId\" 
在jongo文档中,指定类应该有一个空构造函数。。。我有两个构造函数,我也尝试过使用@JsonCreator,但没有成功…:(

你知道为什么它不能转换吗?它可能与businessTravelTo中的字段有关,比如List CarDTO for ex?

我最终找到了解决方案

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

现在它工作得很好!:)

JSON文本似乎有一个带有
$oid
字段的某个对象类型的
\u id
字段,而您的
BusinessTravelDTO
有一个
id
类型的
字段。你以为那会怎样不过我有点困惑,因为我看不出您在代码中的什么地方进行编组。向我们展示
acceptBusinessTravel()
方法的意义是什么?@Andreas您可能错过了@MongoObjectId,这个选项允许您在类中使用mongo对象id,但如果您不使用它,那么“\u id”无论如何都是在幕后创建的…:-|我看到了,但这和JSON有什么关系?
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;
  }
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);
  }
}