2016-02-05 2 views
0

Я пытаюсь десериализация «OnClick» события, содержащееся в «модуле» объект, представленный следующей JSON:десериализация родительского объекта на основе идентификатора

{ 
    "parent": { 
     "id": 0, 
     "children": [{ 
      "child": { 
       "id": 1, 
       "description": "A", 
       "parent": 0, 
       "events": [{ 
        "onclick": { 
         "source": 1 
        } 
       }] 
      } 
     }] 
    } 
} 

Классовая структура очень проста:

View (Interface) 
+- AbstractView 
    +- Parent 
     +- Child 

Event (Interface) 
+- AbstractEvent 
    +- OnClick 

AbstractEvent:

public abstract class AbstractEvent implements Event { 

    private View source; 

    protected AbstractEvent() {} 

    protected AbstractEvent(View source) { 
     this.source = source; 
    } 

    @Override 
    public View getSource() { 
     return source; 
    } 

    @Override 
    public void setSource(View source) { 
     this.source = source; 
    } 

} 

Я использую Примеси, как модель используется betwee n несколько различных проектов.

ViewMixIn:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "type") 
@JsonSubTypes({ 
    @Type(value = Parent.class, name = "parent"), 
    @Type(value = Child.class, name = "child") 
}) 
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id") 
public abstract class ViewMixIn { 

} 

EventMixIn:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "class") 
@JsonSubTypes({ 
    @Type(value = OnClick.class, name = "onclick") 
}) 
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "source") 
public abstract class EventMixIn { 

} 

SimplifiedModule:

@Override 
public void setupModule(SetupContext context) { 
    super.setupModule(context); 

    context.setMixInAnnotations(AbstractView.class, ViewMixIn.class); 
    context.setMixInAnnotations(AbstractEvent.class, EventMixIn.class); 

} 

конфигурации ObjectMapper:

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new SimplifiedModule()) 
    .setSerializationInclusion(NON_NULL) 
    .setSerializationInclusion(NON_EMPTY) 
    .enableDefaultTyping() 
    .enableDefaultTyping(NON_FINAL, As.WRAPPER_OBJECT) 
    .setVisibilityChecker(
     mapper.getSerializationConfig().getDefaultVisibilityChecker() 
      .withFieldVisibility(JsonAutoDetect.Visibility.ANY) 
      .withGetterVisibility(JsonAutoDetect.Visibility.NONE) 
      .withSetterVisibility(JsonAutoDetect.Visibility.NONE) 
      .withCreatorVisibility(JsonAutoDetect.Visibility.NONE)); 

Как видно, модель сериализация правильно, но при десериализации я получаю следующее сообщение об ошибке:

WARN 11:46:04:949 br.com.pdcore.appmaker.middleware.simplified.SimplifiedModelTest - Could not deserialise Parent. com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (VALUE_NUMBER_INT), expected START_OBJECT: need JSON Object to contain As.WRAPPER_OBJECT type information for class br.com.pdcore.appmaker.middleware.simplified.model.view.View at [Source: {"parent":{"id":0,"children":{"java.util.ArrayList":[{"child":{"id":1,"description":"A","parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":1}}]}}},{"child":{"id":2,"description":"B","parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":2}}]}}},{"child":{"id":3,"description":"C","parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":3}}]}}},{"child":{"id":4,"description":"D","parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":4}}]}}},{"child":{"id":5,"description":"E","parent":0,"events":{"java.util.ArrayList":[{"onclick":{"source":5}}]}}}]}}}; line: 1, column: 145] (through reference chain: br.com.pdcore.appmaker.middleware.simplified.model.view.Parent["children"]->java.util.ArrayList[0]->br.com.pdcore.appmaker.middleware.simplified.model.view.Child["events"]->java.util.ArrayList[0]->br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick["source"])

Как будто не понимая, что «источник» идентификатор относится к дочернему объекту оберточного узла OnClick.

Если я изменяю Смешение определений из:

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.WRAPPER_OBJECT, property = "name") 

к:

@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "type") 

Я все еще получаю подобную ошибку:

WARN 12:04:35:126 br.com.pdcore.appmaker.middleware.simplified.SimplifiedModelTest - Could not deserialise Parent. com.fasterxml.jackson.databind.JsonMappingException: Unexpected token (VALUE_NUMBER_INT), expected FIELD_NAME: missing property '@class' that is to contain type id (for class br.com.pdcore.appmaker.middleware.simplified.model.view.View) at [Source: {"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Parent","id":0,"children":["java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Child","id":1,"description":"A","parent":0,"events":["java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":1}]]},{"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Child","id":2,"description":"B","parent":0,"events":["java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":2}]]},{"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Child","id":3,"description":"C","parent":0,"events":["java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":3}]]},{"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Child","id":4,"description":"D","parent":0,"events":["java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":4}]]},{"type":"br.com.pdcore.appmaker.middleware.simplified.model.view.Child","id":5,"description":"E","parent":0,"events":["java.util.ArrayList",[{"type":"br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick","source":5}]]}]]}; line: 1, column: 331] (through reference chain: br.com.pdcore.appmaker.middleware.simplified.model.view.Parent["children"]->java.util.ArrayList[0]->br.com.pdcore.appmaker.middleware.simplified.model.view.Child["events"]->java.util.ArrayList[0]->br.com.pdcore.appmaker.middleware.simplified.model.event.OnClick["source"])

ответ

0

После более тесного чтения Javadoc JsonIdentityInfo в следующих выявила проблему:

Object id has to be serialized as a property in case of POJOs; object identity is currently NOT support for JSON Array types (Java arrays or Lists) or Java Map types.

Таким образом, в основном мне нужно создать собственный десериализатор.

Смежные вопросы