2016-09-11 6 views
0

Iを正しく日付をシリアル化する方法の提案の多くを見つけましたが、次の場合に適用可能なものはありませんしました:ジャージー/ジャクソン - クラスオブジェクトのシリアル化

public class CustomFilter { 
    private String filterName; 
    private List<Filter> filters; 
    //getters and setters 
} 

public class Filter { 
    private String propertyName; 
    private String comparison; 
    private Object value; 
    //getters and setters 
} 

問題はフィルターでその値のプロパティですString、NumberまたはDateにすることができます。したがって CustomFilterのインスタンスは(クライアントとリソースの間で)適切にシリアライズ/デサライズされますが、Filter値がDateの場合、JodaベースのDateの場合はそれを表します(デシリアライズされた場合)。オブジェクトのプロパティがオブジェクトの型であるが、上記のいずれかの型である場合、オブジェクトのプロパティがどのように扱われるかを知っている人なら、コメントを残してください。

+0

を重要なものであるということであるクラスが別々であるかではないことを明示してください:他の1つの内部クラスがあり、OR何? –

+0

はい、クラスは別です – aime

答えて

1

1つのオプションは、 3種類

public class ValueHolder { 
    private Date date; 
    private JodatDate jodaDate; 
    private Number number; 
    private String string; 
    // getters and setters omitted 
    // maybe add additional logic to ensure only one value is set. 
} 

次に、問題なくシリアル化/シリアル化できるようにする必要があります。コンテナオブジェクトを持たないカスタムシリアライザを使用する場合は、json出力にオブジェクトの型を記述し、その情報を受信側で逆シリアル化する必要があります。

0

私の理解が正しい場合は、オブジェクト変数として "値"をデシリアライズするかどうかは関係ありません。デシリアライズ後にObject変数をどのように扱うかは、あなたが考えるべきものです。

私はジャクソンと以下を試しました。

クラスのアドレスを作成します。

public class Address { 
    private String street; 
    private String city; 
    private Object zip; 
    public String getStreet() { 
     return street; 
    } 
    public void setStreet(String street) { 
     this.street = street; 
    } 
    public String getCity() { 
     return city; 
    } 
    public void setCity(String city) { 
     this.city = city; 
    } 
    public Object getZip() { 
     return zip; 
    } 
    public void setZip(Object zip) { 
     this.zip = zip; 
    } 
} 

クラスIDを作成します。

public class Id { 
    private String fname; 
    private String lname; 
    private Address addr; 
    public String getFname() { 
     return fname; 
    } 
    public void setFname(String fname) { 
     this.fname = fname; 
    } 
    public String getLname() { 
     return lname; 
    } 
    public void setLname(String lname) { 
     this.lname = lname; 
    } 
    public Address getAddr() { 
     return addr; 
    } 
    public void setAddr(Address addr) { 
     this.addr = addr; 
    } 
} 

主な方法:

import com.fasterxml.jackson.core.JsonProcessingException; 
import com.fasterxml.jackson.databind.ObjectMapper; 

public class Test { 
    public static void main(String[] args) { 
     long zip = 12345; 

     Address addressObj = new Address(); 
     addressObj.setCity("Chicago"); 
     addressObj.setStreet("Some Street"); 
     addressObj.setZip(12345); 

     Id idObj = new Id(); 
     idObj.setAddr(addressObj); 
     idObj.setFname("Test"); 
     idObj.setLname("Tester"); 

     ObjectMapper mapper = new ObjectMapper(); 

     //Object to JSON in String 
     try { 
      String jsonInString = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(idObj); 
      System.out.println(jsonInString); 
     } catch (JsonProcessingException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     }  
    } 
} 

が出力:

{ 
    "fname" : "Test", 
    "lname" : "Tester", 
    "addr" : { 
    "street" : "Some Street", 
    "city" : "Chicago", 
    "zip" : 12345 
    } 
} 

mainメソッドでは、私は、日時のzip =新しい日時(DateTimeZone.UTC)に郵便番号を変更した場合は、結果は以下の通りである:

{ 
    "fname" : "Test", 
    "lname" : "Tester", 
    "addr" : { 
    "street" : "Some Street", 
    "city" : "Chicago", 
    "zip" : { 
     "weekOfWeekyear" : 40, 
     "dayOfWeek" : 1, 
     "dayOfMonth" : 3, 
     "dayOfYear" : 277, 
     "weekyear" : 2016, 
     "monthOfYear" : 10, 
     "year" : 2016, 
     "yearOfEra" : 2016, 
     "yearOfCentury" : 16, 
     "centuryOfEra" : 20, 
     "era" : 1, 
     "millisOfDay" : 83656626, 
     "millisOfSecond" : 626, 
     "secondOfMinute" : 16, 
     "secondOfDay" : 83656, 
     "minuteOfHour" : 14, 
     "minuteOfDay" : 1394, 
     "hourOfDay" : 23, 
     "chronology" : { 
     "zone" : { 
      "fixed" : true, 
      "id" : "UTC" 
     } 
     }, 
     "zone" : { 
     "fixed" : true, 
     "id" : "UTC" 
     }, 
     "millis" : 1475536456626, 
     "afterNow" : false, 
     "beforeNow" : true, 
     "equalNow" : false 
    } 
    } 
} 

ここでのポイントは、あなたがオブジェクト変数を行うこと

関連する問題