2016-09-26 3 views
0

私は、ジャクソンライブラリで複雑なクラスのオブジェクトを作成しようとしています。各オブジェクトには、デシリアライザがJSONの解釈に使用する必要があるスキーマがあります。私の質問は、デシリアライザにスキーマを供給する方法です。ジャクソンでのカスタムJSON逆シリアル化の使用

デシリアライザは、引数のないコンストラクタとオーバーライドする必要のある抽象メソッドdeserialize(parser、context)を持つJSONDeserializerクラスを拡張します。代わりに代わりのメソッドdeserialize(parser、context、value)を使用したいと思います。valueは、スキーマを含む部分的に構築されたオブジェクトです。つまり、deserializeメソッドはvalue.schema()を呼び出してスキーマにアクセスすることができます。オブジェクト自体は、別の方法で使用されるビルダーを使用して区分的に構成されます。

オーバーライドされた抽象メソッドではなく、代わりのdeserializeメソッドをオブジェクトマッパーに登録する方法に関するドキュメントは見つかりませんでした。

アドバイスをいただければ幸いです。

答えて

1

だから、あなたが日付フィールドbirthdateを持ってDataというプロパティを持っている持っているUserと呼ばれるクラスを持っている、とあなたは、標準の日付デシリアライザを使用すると、カスタム1を使用したいと考えていないと言うことができます。以下はその達成方法です。

User.java

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonProperty; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class User { 

    @JsonProperty("code") 
    public Integer code; 
    @JsonProperty("status") 
    public String status; 
    @JsonProperty("message") 
    public String message; 
    @JsonProperty("time") 
    public String time; 
    @JsonProperty("data") 
    public Data data; 

} 

Data.java

import com.fasterxml.jackson.annotation.JsonIgnoreProperties; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.databind.annotation.JsonDeserialize; 

@JsonIgnoreProperties(ignoreUnknown = true) 
public class Data { 

    @JsonProperty("id_hash") 
    public Integer idHash; 
    @JsonProperty("user_name") 
    public String userName; 
    @JsonProperty("user_surname") 
    public String userSurname; 
    @JsonProperty("birthdate") 
    @JsonDeserialize(using = BirthdayDeserializer.class) 
    public Date birthdate; 
    @JsonProperty("height") 
    public Integer height; 
    @JsonProperty("weight") 
    public Integer weight; 
    @JsonProperty("sex") 
    public Integer sex; 
    @JsonProperty("photo_path") 
    public String photoPath; 

} 

BirthdayDeserializer.java

public class BirthdayDeserializer extends JsonDeserializer<Date> { 
    @Override 
    public Date deserialize(JsonParser jsonparser, DeserializationContext deserializationcontext) throws IOException { 

     SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 
     String date = jsonparser.getText(); 
     try { 
      return format.parse(date); 
     } catch (ParseException e) { 
      throw new RuntimeException(e); 
     } 
    } 

} 

Main.javaでテストします。

public class Main { 

    public static void main(String[] args) throws IOException { 

     String json = "{\n" + 
       " \"code\": 1012,\n" + 
       " \"status\": \"sucess\",\n" + 
       " \"message\": \"Datos Del Usuario\",\n" + 
       " \"time\": \"28-10-2015 10:42:04\",\n" + 
       " \"data\": {\n" + 
       "  \"id_hash\": 977417640,\n" + 
       "  \"user_name\": \"Daniel\",\n" + 
       "  \"user_surname\": \"Hdz Iglesias\",\n" + 
       "  \"birthdate\": \"1990-02-07\",\n" + 
       "  \"height\": 190,\n" + 
       "  \"weight\": 80,\n" + 
       "  \"sex\": 2\n" + 
       " }\n" + 
       "}"; 
     ObjectMapper mapper = new ObjectMapper(); 
     SimpleModule module = new SimpleModule(); 
     module.addDeserializer(Date.class, new BirthdayDeserializer()); 
     mapper.registerModule(module); 
     User readValue = mapper.readValue(json, User.class); 
     System.out.println(readValue); 
    } 
} 

私はカスタムDeserializerを登録しているかのようにmainメソッドを確認してください。

+0

私が尋ねたものとまったく同じものではありません。あなたの例では、新しいSimpleDateFormat( "yyyy-MM-dd HH:mm:ss")を使用する代わりに、新しいSimpleDateFormat(myDateFormat)などの日付書式をパラメータにしたいとします。デシリアライザにパラメータmyDateFormatを渡すにはどうすればよいですか? –

+0

あなたのスキーマは変更されますか?もしそうでなければ、それは上記の日に行ったようにそれをすることはできませんか?私はそれをハードコーディングするか、またはそれをいくつかのファイルから読むことを意味しますか? –

+1

いいえ、スキーマは状況によって異なります。それはデータベーステーブルのようなものです。ユーザーはコードを構成する際にスキーマを定義します。スキーマはオブジェクト内のフィールドに保持されます。 –

関連する問題