5

我得到以下从服务器生成的响应cakephp

 [
 {
  "id": "42389",
  "start": "0000-00-00",
  "end": "0000-00-00",
  "event_id": null,
  "trip_id": "5791",
  "location_id": "231552",
  "user_id": "105",
  "users_attending": "0",
  "user_local": "0",
  "Trip": {
   "name": "Asdas"
  },
  "Event": [],
  "Location": {
   "name": "South Melbourne"
  }
 },
 {
  "id": "42392",
  "start": "0000-00-00",
  "end": "0000-00-00",
  "event_id": "1218",
  "trip_id": "4772",
  "location_id": "271505",
  "user_id": "105",
  "users_attending": "3",
  "user_local": "50",
  "Trip": {
   "name": "trip by 1059200"
  },
  "Event": {
   "title": "SampleEvent 454",
   "id": "1218"
  },
  "Location": {
   "name": "Houston"
  }
 },
 .......
 ]

问题是解析器需要Event对象,但如果是,null那么它正在接收空数组。

由于响应是由 自动生成的cakephp,因此必须在服务器端的很多地方进行更改。

Event如果它是一个空数组,杰克逊是否有任何简单的方法来忽略属性?

编辑:

我尝试过拥有两个带有Event名称的属性:一个数组和另一个对象,但这也不起作用。

4

3 回答 3

2

因为,我不得不为许多对象处理这样的响应,所以我最终继续创建一个通用类,该类将为Deserializer特定的class.

这是我用的

public class Deserializer<T> {

  public JsonDeserializer<T> getDeserializer(final Class<T> cls) {
      return new JsonDeserializer<T> (){

         @Override
         public T deserialize(JsonParser jp, DeserializationContext arg1) throws IOException, JsonProcessingException {
            JsonNode node = jp.readValueAsTree();
            if (node.isObject()) {
              return new ObjectMapper().convertValue(node, cls);
            }
            return null;
         }
     };
}

}

于 2012-10-13T18:52:52.347 回答
1

如果类型不兼容,我认为将其分开是有意义的。

另一种选择是使用常见的超类型,这意味着java.lang.Object,您将获得List(对于 JSON 数组)或Map(对于 JSON 对象)。但是需要进行后处理才能绑定到具体类型。

于 2012-10-02T21:21:05.003 回答
0

我发现这个问题最简单的解决方案是添加以下功能:

DeserializationFeature.ACCEPT_EMPTY_ARRAY_AS_NULL_OBJECT, true

到我的对象映射器。杰克逊会为您完成其余的工作。请参阅https://fasterxml.github.io/jackson-databind/javadoc/2.6/com/fasterxml/jackson/databind/DeserializationFeature.html

这个答案给出了深入的解释:https ://stackoverflow.com/a/22956168/9279756

于 2019-06-15T08:55:10.320 回答