2016-11-25 7 views
1

類似の質問herehereがありますが、それらは私の状況にはあまり関係ありません。私のJSON文字列は、配列とオブジェクトで構成されていますJackson ObjectMapperは配列でオブジェクトを逆シリアル化します

{ 
    "data": [ 
    { 
     "id": 1, 
     "title": "Sample training", 
     "date": "2016-10-03 10:00:00", 
     "subscription": "2016-09-20 12:34:50" 
    }, 
    { 
     "id": 2, 
     "title": "Second training", 
     "date": "2016-10-06 10:00:00", 
     "subscription": "2016-09-20 12:54:50" 
    } 
    ] 
} 

配列内の各オブジェクトは、Java Beanです:

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JavaTimeModule()); 
TrainingInfo training = mapper.readValue(jsonTrainingInfo, TrainingInfo.class); 
:私は持つ単一 TrainingInfoを読むことができています

public class TrainingInfo { 

    private int id; 
    private String title; 
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") 
    private LocalDateTime date; 
    @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") 
    private LocalDateTime subscription; 

    // Consructors, getters and setters omitted 
    // ... 
} 

しかし、私は配列全体を読むことができません。私はそうのように、単にアレイをcontainng新しいJava Beanを作成し、それを読むことを試みている:

private class TrainingsArray { 
    private TrainingInfo[] data; 

    public TrainingInfo[] getData() { 
     return data; 
    } 

    public void setData(TrainingInfo[] data) { 
     this.data = data; 
    } 
} 

ObjectMapper mapper = new ObjectMapper(); 
mapper.registerModule(new JavaTimeModule()); 
TrainingsArray trainings = mapper.readValue(jsonTrainingsArray, TrainingsArray.class); 

しかし、これは単なるIOExceptionをスローします。 私は何が欠けていますか?

UPDATE:例外がスローさ:これはあるかもしれない

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of JsonMapperTest$TrainingsArray: no suitable constructor found, can not deserialize from Object value (missing default constructor or creator, or perhaps need to add/enable type information?) 
at [Source: { 
    "data": [ 
    { 
     "id": 1, 
     "title": "Sample training", 
     "date": "2016-10-03 10:00:00", 
     "subscription": "2016-09-20 12:34:50" 
    }, 
    { 
     "id": 2, 
     "title": "Second training", 
     "date": "2016-10-06 10:00:00", 
     "subscription": "2016-09-20 12:54:50" 
    } 
    ] 
}; line: 2, column: 3] 

    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:270) 
    at com.fasterxml.jackson.databind.DeserializationContext.instantiationException(DeserializationContext.java:1456) 
    at com.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1012) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1205) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:314) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:148) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3798) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2842) 
    at JsonMapperTest.shouldMapJsonResponseToTrainingsArray(JsonMapperTest.java:90) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:300) 
    at org.junit.runner.JUnitCore.run(JUnitCore.java:157) 
    at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68) 
    at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:51) 
    at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:237) 
    at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) 
+0

あなたは 'IOException'を含めることができますか? –

+1

私はそれをプライベートクラスとして定義していると思います。 –

+3

TrainingsArrayクラスを最上位クラス、または少なくとも内部クラスではなく静的入れ子クラスにします。内部クラスは、構築する外部インスタンスへの参照を必要とします。 JacksonはJsonMapperTestのインスタンスを作成する必要があります。そして、それはしません。 –

答えて

1

しかし愚かな、解決策は、クラスTrainingsArray国民を作ることでした。

関連する問題