2017-02-08 8 views
0

Jsonファイルを読み込むためにJacksonフレームワークを使用してScalaプログラムを作成しました。 Scalaプログラムを実行するたびに次のエラーが発生します。誰も私はこのエラーを克服する方法を提案することができます。[単純型、クラス定義]のタイプに適したコンストラクタが見つかりません

エラー

Exception in thread "main" com.fasterxml.jackson.databind.JsonMappingException: No suitable constructor found for type [simple type, class Definition]: can not instantiate from JSON object (need to add/enable type information?) 
at [Source: { "recordDefinitions": [ {  "recordDefinitionIdentifier": 2,  "recordTypeCode": "LT",  "recordTypePattern": "^.{14}LT.*$",  "minimumNumberOfAttributes": 19,  "expectedNumberOfAttributes": 19,  "recordLength": 117,  "attributes": [  {   "attributeIdentifier": 1,   "attributeName": "PROVIDER TYPE",   "attributeMaximumLength": 1,   "datatype": {   "datatypeName": "AN"   }  }  ] } ]}; line: 1, column: 4] 
    at com.fasterxml.jackson.databind.JsonMappingException.from(JsonMappingException.java:148) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializerBase.deserializeFromObjectUsingNonDefault(BeanDeserializerBase.java:1071) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:264) 
    at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:124) 
    at com.fasterxml.jackson.databind.ObjectMapper._readMapAndClose(ObjectMapper.java:3066) 
    at com.fasterxml.jackson.databind.ObjectMapper.readValue(ObjectMapper.java:2161) 
    at Json_Parser_Jackson$.main(Json_Parser_Jackson.scala:33) 
    at Json_Parser_Jackson.main(Json_Parser_Jackson.scala) 
    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) 

プログラム

import java.io.{File, StringWriter} 

    import java.util 

    import com.fasterxml.jackson.core.`type`.TypeReference 
    import com.fasterxml.jackson.databind.ObjectMapper 
    import com.fasterxml.jackson.module.scala.DefaultScalaModule 
    import org.apache.avro.ipc.specific.Person 

    import scala.io.Source 


    case class Definition(recordDefinitions: Seq[RecordDefinitionsClass]) 
    case class RecordDefinitionsClass(recordDefinitionIdentifier:Int,recordTypeCode: String,recordTypePattern:String,minimumNumberOfAttributes: Int,expectedNumberOfAttributes: Int,recordLength:Int,attributes: Seq[Attributes]) 
    case class Attributes(attributeIdentifier: Int,attributeName:String,attributeMaximumLength:Int,datatype: Seq[DataType]) 
    case class DataType(datatypeName:String) 

     object Json_Parser_Jackson { 
     def main(args: Array[String]): Unit = { 
      val fileContent = Source.fromFile("C:\\Users\\xxxnd\\ideaProject\\jsonparser\\src\\main\\resources\\Json_file.json","UTF-8").getLines.mkString 

      val mapper = new ObjectMapper() 
      mapper.registerModule(DefaultScalaModule) 

      val person2: Definition = new ObjectMapper().readValue(fileContent,classOf[Definition]) 

      println(person2) 


     } 
     } 

JSONファイル

{ 
    "recordDefinitions": [ 
    { 
     "recordDefinitionIdentifier": 2, 
     "recordTypeCode": "LT", 
     "recordTypePattern": "^.{14}LT.*$", 
     "minimumNumberOfAttributes": 19, 
     "expectedNumberOfAttributes": 19, 
     "recordLength": 117, 
     "attributes": [ 
     { 
      "attributeIdentifier": 1, 
      "attributeName": "PROVIDER TYPE", 
      "attributeMaximumLength": 1, 
      "datatype": { 
      "datatypeName": "AN" 
      } 
     } 
     ] 
    } 
    ] 
} 

答えて

1

私が勘違いしておりません場合は、Scalaのケースクラスはパラメータなしのコンストラクタを持っていますが、すべてを持つコンストラクタはありませんフィールドをパラメータとして使用し、コンパニオンオブジェクトのメソッドを使用します。 Jacksonオブジェクトマッパーは、クラスを最初にインスタンス化するために、パラメータのないコンストラクタを必要とします。だから、ほとんどの「ジャクソン」の方法ではなく、ここのようなケースクラスのJavaのPOJOを作成するには、次のようになります。Jackson Github

私はこのようなものを使用することができことをお勧め: Implicit JSON conversion

をまたthis answer.

+1

いずれかを参照してください。 (@ JsonProperty'、またはJava 8 JVMと 'jackson-module-parameter-names'を使用するプロパティの名前とともに)使用するパラメータ取得コンストラクタを示すために' @ JsonCreator'を使用する – StaxMan

関連する問題