繁体   English   中英

Jersey / Jackson-类对象序列化

[英]Jersey / Jackson - class Object serialization

我发现了很多有关如何正确序列化Date的建议,但没有适用于下一种情况的建议:

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
}

问题是筛选器中的value属性可以是字符串,数字或日期。 因此,CustomFilter的实例已正确地序列化/反序列化(在客户端和资源之间),但是如果Filter值为Date,则它表示的时间就长,如果它是基于Joda的Date,则它表示为元素的LinkedHashMap(反序列化时)。 如果有人知道如何处理这种情况(当object属性是Object的一种类型,但可以是上述类型的任何一种时)-请发表评论

一种选择是创建一个容器对象,其中包含三种类型之一

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输出中写入对象的类型,并使用该信息在接收端反序列化它。

如果我的理解是正确的,那么您是否反序列化将“值”保留为Object变量也没关系。 反序列化后如何处理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
  }
}

如果在主要方法中,我将zip更改为DateTime zip = new DateTime(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
    }
  }
}

这里的重点是,您使用Object变量所做的事情很重要

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM