【问题标题】:CsvSchema and NUMBERCSVSchema 和 NUMBER
【发布时间】:2012-11-26 16:49:41
【问题描述】:

我创建了一个将在 CSVMapper.schemaFor 中使用的 Java POJO:

@JsonPropertyOrder({ "mkg_brnd_id", "prnt_brnd_id" })
public class MKG_BRND {
    public int mkg_brnd_id;
    public int prnt_brnd_id;
}

但是,这些字段的 CSV 值可能是数字或空值。当它遇到空值时,我收到错误消息:

Can not construct instance of int from String value 'null': not a valid Integer value

我尝试使用@JsonFormat 注释来指示应该允许数字或空值的NUMBER:

@JsonPropertyOrder({ "mkg_brnd_id", "prnt_brnd_id" })
public class MKG_BRND {
    @JsonFormat(shape=JsonFormat.Shape.NUMBER)
    public int mkg_brnd_id;
    @JsonFormat(shape=JsonFormat.Shape.NUMBER)
    public int prnt_brnd_id;
}

但是没有喜悦,我仍然收到错误信息。

我还尝试了以下方法:

@JsonPropertyOrder({ "mkg_brnd_id", "prnt_brnd_id" })
public class MKG_BRND {
    @JsonFormat(shape=JsonFormat.Shape.NUMBER)
    public Integer mkg_brnd_id;
    @JsonFormat(shape=JsonFormat.Shape.NUMBER)
    public Integer prnt_brnd_id;
}

关于如何创建允许数值具有“null”值的架构的想法?

更新(11/26/2012 @ 11:56 am CST):

最终不得不重写 getter/setter 并像这样自己操作值:

@JsonPropertyOrder({ "mkg_brnd_id", "prnt_brnd_id" })
public class MKG_BRND {
    @JsonFormat(shape=JsonFormat.Shape.NUMBER)
    public Integer mkg_brnd_id;
    @JsonFormat(shape=JsonFormat.Shape.NUMBER)
    public Integer prnt_brnd_id;

public Integer getMkg_brnd_id() {
    return mkg_brnd_id;
}

public void setMkg_brnd_id(String anIntValue) {
    if ((C_NULL_UC.equals(anIntValue)) ||
         (C_NULL_LC.equals(anIntValue))) {
        this.mkg_brnd_id = null;
    }
    else {
        this.mkg_brnd_id = new Integer(aIntValue);
    }
}
}

【问题讨论】:

    标签: java csv jackson


    【解决方案1】:

    int 是一种原始类型,无论您在类中添加什么注释,都不能设置为 null。如果这些属性确实可能为 null,则应将它们从 int 更改为 Integer

    【讨论】:

    • 是的,我知道,这些值也可能是整数(我试过了),但我仍然得到同样的错误。问题似乎是让解析引擎识别 *.csv 中的 null 值是一个特殊值,而不是字符串“null”,如果是整数,则将其呈现为 null。
    • 如果我查看 CsvSchema.ColumnType 的 JavaDoc,它指出 NUMBER: Value 应该是一个数字,但也可以理解文字“null”、“true”和“false”。我只是在努力弄清楚如何让解析器将值视为数字。
    • @Dutchman 知道了。我误解了。那我就不知道了。告诉你什么,用你尝试过 Integer 但它没有用的事实来更新你的问题。然后我会在几分钟内删除我的答案。如果您的问题没有得到解答,您可能会采取更多行动。
    • 我终于想出了一个可行的解决方案来覆盖 getter/setter 并自己操作它。我本来希望用某种类型的注释来标记这个值,它可以神奇地工作,但这就是生活。
    【解决方案2】:

    听起来像是https://github.com/FasterXML/jackson-dataformat-csv/issues 的 RFE 建议——对于其他用户来说,这听起来像是一个很好的改进。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-15
      • 2017-02-16
      • 1970-01-01
      • 2015-03-28
      • 1970-01-01
      • 2011-01-23
      • 2017-04-21
      • 2016-03-23
      相关资源
      最近更新 更多