2017-02-21 16 views
0

私は、私は次のエラーを取得しています以下のJSONデシリアライズJSONの配列

{ 
    "state":"RT", 
    "testMethod":"electronic", 
    "testElements":[ 
     { 
     "testId":[ 
      "UT_ITXref", 
      "Fed_ITXref" 
     ] 
     }, 
     "testStartDate", 
     "testEndDate", 
     "testDueDate" 
    ] 
} 

を解析しようと平野strings.I'mを含む配列をデシリアライズするかどうかはわかりません。

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of com.test.rules.model.TestElements: no String-argument constructor/factory method to deserialize from String value ('testStartDate') 
at [Source: {"state":"RT","testMethod":"electronic","testElements":[{"testId":["UT_ITXref","Fed_ITXref"]},"testStartDate","testEndDate","testDueDate"}]}; line: 1, column: 247] (through reference chain: com.test.rules.model.TestRules["testElements"]->java.lang.Object[][1]) 
    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.ValueInstantiator._createFromStringFallbacks(ValueInstantiator.java:370) 
    at com.fasterxml.jackson.databind.deser.std.StdValueInstantiator.createFromString(StdValueInstantiator.java:315) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromString(BeanDeserializerBase.java:1282) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeOther(BeanDeserializer.java:159) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:150) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:196) 
    at com.fasterxml.jackson.databind.deser.std.ObjectArrayDeserializer.deserialize(ObjectArrayDeserializer.java:20) 
    at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:499) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeWithErrorWrapping(BeanDeserializer.java:511) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer._deserializeUsingPropertyBased(BeanDeserializer.java:396) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1198) 
    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.ObjectReader._bindAndClose(ObjectReader.java:1626) 
    at com.fasterxml.jackson.databind.ObjectReader.readValue(ObjectReader.java:1220) 
ここで

は私がやったことですが、私は

public class TestRules { 

    private String state; 
    private String testMethod; 
    private TestElements[] testElements;  

    @JsonCreator 
     public TaxRules(
      @JsonProperty("state") String state,  
      @JsonProperty("testMethod") String testMethod,   
      @JsonProperty("testElements") TestElements[] testElements 
     ) { 
      this.state = state;   
      this.testMethod = testMethod;   
      this.testElements = testElements;   
     } 

} 

public class TestElements { 
    private List<String> testId; 
    private List<String> elements; 

    public List<String> getElements() { 
      return elements; 
     } 
     public void setElements(List<String> elements) { 
      this.elements = elements; 
     } 
     public List<String> getTestId() { 
      return testId; 
     } 
     public void setTestId(List<String> testId) { 
      this.testId = testId; 
     } 

} 

私はカスタムデシリアライザを書くべきデシリアライズする@JsonCreatorアノテーションを使用したりですそこに私はこれのためにジャクソンAPIを使うことができる何らかの方法があります。任意の提案をいただければ幸いです。

+3

'json'は無効と思われます。 'testStartDate'、' testEndDate'などに値がないのは確かですか? –

+1

jsonが無効か、jsonを表すクラスが無効です。 jsonは、json仕様に完全に準拠しています。 'testElements'はjsonのオブジェクトと文字列が混在しているようですが、pojosは特定の形状のオブジェクトしか期待していません – Atreys

+0

jsonが正しい場合は、おそらくカスタムのシリアライザを作成する必要があります。 http://stackoverflow.com/questions/40915356/json-deserialization-in-java-w-jackson-of-mixed-types-contained-in-one-arrayにも同様の状況がありますが、2つの異なるオブジェクトタイプがあります – Atreys

答えて

1

実際にはエラーが発生します。

JSONパーサーは、testElementsプロパティにはオブジェクトの配列がありますが、Jsonファイルには内容が混在していることがわかりました。

最初の要素はオブジェクトです(私はそれがTestElementクラスと仮定します)。その後、パーサは空のコンストラクタでそのオブジェクトを作成し、プロパティの適切なセッタを呼び出します。 しかし...

第2、第3および第4要素は文字列なので、パーサーは引数としてStringを持つconstrictorを検索しようとします。

したがって、TestElementクラスでそのコンストラクタを作成しようとすると、それが動作するかどうかを確認してください... 空のコンストラクタも忘れないようにしてください。

私はそれが動作することを保証することはできませんが、少なくともエラーがそれを言う。

あなたのJsonオブジェクトは正しいですか?そのようなものではない?

{ 
"state":"RT", 
"testMethod":"electronic", 
"testElements":[ 
    { 
    "testId":[ 
     "UT_ITXref", 
     "Fed_ITXref" 
    ] 
    }], 
    "testStartDate":"01-01-2017", 
    "testEndDate":"01-02-2017", 
    "testDueDate":"01-03-2017" 
} 

開始日、終了日、DueDateが意味的にtestElements配列

+0

ありがとう、私は文字列引数のコンストラクタを試してみます。私が提供したJSONは有効なものです。このjsonを別のサービスに渡して、testElementsの値を取得する必要があります。 – PKR

+0

文字列の引数コンストラクタがトリックを行いました。ありがとう。 – PKR

+0

それを聞いてうれしいです。それは私には新しく、ジャクソンとは可能な方法であることを覚えておきます。 – Vadim

0
{ 
    "state": "RT", 
    "testMethod": "electronic", 
    "testElements": [ 
     { 
      "testId": [ 
       "UT_ITXref", // <-- this object is deserialized just fine 
       "Fed_ITXref" 
      ] 
     }, 
     "testStartDate",  // <-- this is where the error is happening 
     "testEndDate", 
     "testDueDate" 
    ] 
} 

の要素は、あなたがJSONがあるかのように解釈されるように意図したのではないとして、より多くのテスト属性のように見えるので、私は少し混乱しています次のように見えましたか?

{ 
    "state": "RT", 
    "testMethod": "electronic", 
    "testElements": [ 
     { 
      "testId": [ 
       "UT_ITXref", 
       "Fed_ITXref" 
      ] 
     }, 
     { 
      testId: [ 
       "testStartDate" 
      ] 
     }, 
     { 
      testId: [ 
       "testEndDate" 
      ] 
     }, 
     { 
      testId: [ 
       "testDueDate" 
      ] 
     } 
    ] 
} 

もしそうなら、あなたは配列の要素がオブジェクトまたは文字列であるかどうかを検出するためのカスタムデシリアライザを作成する必要があります。文字列の場合は、TestElementを自分で作成することをお勧めします。

+0

お時間をありがとう。残念ながら、それは私のために動作しません。私はあなたにサンプルjsonを与えました。実際のJSONには、さまざまなオブジェクト(testIdなど)と文字列の要素が多くあります。 Vadimが提案するString引数コンストラクタを試してみましょう。それがうまくいけば、カスタムのシリアライザが必要になります。 – PKR

関連する問題