【问题标题】:Problems deserializing iso-8601 formatted date from JSON String using Gson使用 Gson 从 JSON 字符串反序列化 iso-8601 格式日期的问题
【发布时间】:2016-01-06 18:24:54
【问题描述】:

我有一个 {"item":"CDigital_cam_80X","manufacturer":"Canon","model":"95 IS","announced-date":"2009-02-17T19:00:00.000-05:00"} 形式的简单 JSON 字符串

我创建了一个 Java Bean 并编写了代码来使用 Gson 反序列化字符串以获取对象,但由于某种原因,announced_date 字段每次都返回 null。

这里是反序列化的代码sn-p

Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ").create();                    
                    currentProduct = gson.fromJson(currentLine, Product.class);

这是产品类别。

import java.util.Date;


public class Product {

    private String product_name;
    private String manufacturer;
    private String model;
    private Date announced_date;

    public String getProduct_name() {
        return product_name;
    }

    public void setProduct_name(String product_name) {
        this.product_name = product_name;
    }

    public String getManufacturer() {
        return manufacturer;
    }

    public void setManufacturer(String manufacturer) {
        this.manufacturer = manufacturer;
    }

    public String getFamily() {
        return family;
    }

    public void setFamily(String family) {
        this.family = family;
    }

    public String getModel() {
        return model;
    }

    public void setModel(String model) {
        this.model = model;
    }

    public Date getAnnounced_date() {
        return announced_date;
    }

    public void setAnnounced_date(Date announced_date) {
        this.announced_date = announced_date;
    }

    @Override
    public String toString()
    {
        StringBuilder sb = new StringBuilder();
        sb.append("{ \n");
        sb.append(" product_name: "); sb.append(this.getProduct_name()); sb.append("\n");
        sb.append(" manufacturer "); sb.append(this.getManufacturer()); sb.append("\n");
        sb.append(" family: "); sb.append(this.getFamily()); sb.append("\n");
        sb.append(" model: "); sb.append(this.getModel()); sb.append("\n");
        sb.append(" announced_date: "); sb.append(this.getAnnounced_date()); sb.append("\n");
        sb.append("}");

        return sb.toString();
   }
}

这是我运行代码并打印出反序列化对象的属性时得到的结果

{
item:CDigital_cam_80X
manufacturer Canon
model:95 IS
announced-date:null
}

我做错了什么?

【问题讨论】:

    标签: java json gson


    【解决方案1】:

    你有两个问题--

    在您的 JSON 中,该字段被命名为“announced-date”,但在您的 POJO 中它是“announced_date”。请注意有一个下划线而不是破折号。 GSON 将这些视为两个不同的领域。要解决此问题,请使用 @SerializeName 注释。

    @SerializedName("announced-date")
    private Date announced_date;
    

    其次,您的数据格式不适合时区说明符。 Z 应该是 XZ 在规范中没有冒号 (:)。 X 确实如此。见SimpleDateFormat

    【讨论】:

    • 谢谢。像魔术一样修复它。我注意到您将产品类称为 POJO,它是 POJO 还是 Java Bean 或两者兼而有之?
    • 你的课是两个,imo。有关该主题的完整讨论,请参阅此处stackoverflow.com/q/1394265/1904517
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-12
    • 1970-01-01
    • 1970-01-01
    • 2018-06-26
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多