GSON中的自定义反序列化?

时间:2011-10-25 01:00:53

标签: java gson

我需要创建一个自定义反序列化程序,以便我能够正确地反序列化我以这种格式收到的日期:2011-10-19T23:30:00-04:00。我的Date对象是许多字段之一,包含我正在反序列化的Object的许多嵌套类中的一个。除了Date之外,一切正常。我的班级看起来像这样:

public class OfferContainer{

    public Offer offer;

    public OfferContainer(){}   

    @Override
    public String toString()
    {
        return this.getID() +  offer.toString();
    }

    public String getDescription() {
        return offer.description;
    }

    public String getBusinessName() {
        return offer.business.name;
    }



    public class Offer
    {
        public Category category;
        public String description;
        public String discount;
        public Date expiration;
        public Date published;
        public String rescinded_at;
        public String title;
        public String hook;
        public Date valid_from;
        public Date valid_to;
        public String id;
        public Business business;
        public Location location;
        public String image_270x155;


        @Override
        public String toString()
        {
            return String.format(
                    "[Offer: category=%1$s, description=%2$s, discount=%3$s, expiration=%4$s, published=%5$s, rescinded_at=%6$s, title=%7$s, valid_from=%8$s, valid_to=%9$s, id=%10$s, business=%11$s, location=%12$s]",
                    category, description, discount, expiration, published, rescinded_at, title, valid_from, valid_to, id,
                    business, location);
        }

    }

   public enum Category
    {
        Salon, Spa, Restaurant, Other
    }



    public class Business
    {
        public String name;
        public String phone;
        public Address address;


        @Override
        public String toString()
        {
            return String.format(
                    "[Business: name=%1$s, phone=%2$s, address=%3$s]",
                    name, phone, address);
        }
    }


    public  class Address
    {
        public String address_1;
        public String address_2;
        public String city;
        public String cross_streets;
        public String state;
        public String zip;



        @Override
        public String toString()
        {
            return String.format(
                    "[Address: address_1=%1$s, address_2=%2$s, city=%3$s, cross_streets=%4$s, state=%5$s, zip=%6$s]",
                    address_1, address_2, city, cross_streets, state, zip);
        }
    }

    public class Location {
        public double latitude;
        public double longitude;



        public String toString() {
            return String.format("[Location: longitude=%1$s, latitude=%2$s]", longitude, latitude);
        }

    }

}

如何在此方案中使用registerTypeAdapter,如何为此正确实现自定义反序列化?

提前致谢!

另外,如果重要的话,这就是我实际上如何得到我的POJO:

  OfferContainer[] offers = gson.fromJson(json, OfferContainer[].class);

这是JSON:

{
    "offer":{
        "category":"Salon",
        "description":"Use this offer now to enjoy this great Salon at a 20% discount. ",
        "discount":"20",
        "expiration":"2011-04-08T02:30:00Z",
        "published":"2011-04-07T12:00:33Z",
        "rescinded_at":null,
        "title":"20% off at Jun Hair Salon",
        "valid_from":"2011-04-07T12:00:31Z",
        "valid_to":"2011-04-08T02:00:00Z",
        "id":"JUN_HAIR_1302177631",
        "business":{
            "name":"Jun Hair Salon",
            "phone":"2126192989",
            "address":{
                "address_1":"12 Mott St",
                "address_2":null,
                "city":"New York",
                "cross_streets":"Chatham Sq & Worth St",
                "state":"NY",
                "zip":"10013"
            }
        },
        "location":{
            "latitude":"40.714021",
            "longitude":"-73.998663"
        },
        "distance":619.8162766744034,
        "draws":[
            "Hair Cut",
            "Blow Dry",
            "Blow Dry Treatment"
        ],
        "claim_link":"http://m-s.com/offers/JUN_HAIR_1302177631?app_id=SavIMg",
        "mobile_claim_link":"http://m-s.com/offers/JUN_HAIR_1302177631?app_id=SavIMg"
    }
}

1 个答案:

答案 0 :(得分:3)

您需要实现JSONDeserializer<OfferContainer>,然后覆盖deserialize方法来实现此目的。看看这个问题GSON deserializing key-value to custom object

您也可以尝试在GsonBuilder中设置日期格式

 Gson gson = new GsonBuilder()
     .setDateFormat("yyyy-MM-dd'T'HHmmss.SSS'Z'")
     .create();
 OfferContainer [] offers = gson.fromJson(json, OfferContainer[].class);