Десериализация Джексона… Неожиданный токен (END_OBJECT),

Я пытаюсь десериализовать массив JSON в коллекцию Java с помощью Джексона. Это мотивировано ответами на этот вопрос, который я задал вчера вечером Могу ли я создать экземпляр суперкласса и создать конкретный подкласс на основе предоставленных параметров .

Я получаю сообщение об ошибке (добавлены разрывы строк для читаемость):

org.codehaus.jackson.map.JsonMappingException: 
    Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type'
    that is to contain type id  (for class sempedia.model.query.QueryValue)
 at [Source: java.io.StringReader@325aef; line: 1, column: 175] 
    (through reference chain: sempedia.model.query.QueryProperty["values"])

Моя ситуация довольно сложная. Мой массив содержит объекты, которые сами содержат значение, которое является массивом. Этот массив, в свою очередь, содержит значения, которые также являются объектами, но не обязательно одинаковыми (таким образом, полиморфизм).

Вот пример строки JSON:

[
    {
      "id":"74562",
      "uri":"http://dbpedia.org/ontology/family",
      "name":"family",
      "values":[
         {
            "id":"74563",
            "uri":"http://dbpedia.org/resource/Orycteropodidae",
            "name":"Orycteropodidae"
         }
      ],
      "selected":false
    },
    {
      "id":"78564",
      "uri":"http://dbpedia.org/ontology/someNumber",
      "name":"someNumber",
      "values":[
         {
            "lower":"45",
            "upper":"975",
         }
      ],
      "selected":true
    }
]

Я хотел бы использовать этот (ниже) код или что-то подобное, чтобы получить объект, который является экземпляром Collection , который я назвал queryProperties

ObjectMapper mapper = new ObjectMapper();  
Collection queryProperties = 
   queryProperties = mapper.readValue(query, 
      new TypeReference>(){});

Мои классы для десериализации (у них есть общедоступные геттеры / сеттеры, которые я не печатаю) перечислены ниже:

public class QueryProperty {    
    int id;
    String uri;
    String name;
    Set values;
    String selected;
}

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")  
@JsonSubTypes({  
    @Type(value = ResourceQueryValue.class),  
    @Type(value = NumericQueryValue.class)
    })  
public abstract class QueryValue {
    String type;
}

ResourceQueryValue

public class ResourceQueryValue extends QueryValue{
    int id;
    String uri;
    String name;
}

NumericQueryValue тот же JSON не включает объект этого типа.

public class NumericQueryValue extends QueryValue{
    double lower;
    double upper;
}

Начальная часть трассировки стека:

org.codehaus.jackson.map.JsonMappingException: Unexpected token (END_OBJECT), expected FIELD_NAME: missing property 'type' that is to contain type id  (for class sempedia.model.query.QueryValue)
 at [Source: java.io.StringReader@325aef; line: 1, column: 175] (through reference chain: sempedia.model.query.QueryProperty["values"])
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.wrongTokenException(StdDeserializationContext.java:240)
    at org.codehaus.jackson.map.jsontype.impl.AsPropertyTypeDeserializer.deserializeTypedFromObject(AsPropertyTypeDeserializer.java:86)
    at org.codehaus.jackson.map.deser.AbstractDeserializer.deserializeWithType(AbstractDeserializer.java:89)

13
задан Bucket 16 February 2018 в 20:27
поделиться