将统一映射的数据结构序列化为CSV

时间:2018-02-13 11:09:51

标签: java csv jackson jackson-databind

我必须序列化与此类似的对象:

public class Something {
    String id;

    Map<String, String> name;
    Map<String, String> description;
}

字段namedescription已国际化。键是区域设置标识符(“fr”,“en-US”,“en-UK”,“de”,...),值是该区域设置的相应值。

预期CSV的标题行必须如下所示:

id,name.fr,name.en-US,description.fr,description.en-US

如果为了简洁而省略了其他语言。

@JsonUnwrapped似乎没有帮助,因为它会为所有属性生成相同的键“fr”,“en-US”,...。

杰克逊开箱即可实现这一目标吗?对所支持的区域设置标识符列表进行硬编码是可以接受的。

前面还有更多的恶作剧。另一个要序列化的类将如下所示:

public class SomethingElse {
    String id;

    Map <String, Feature> features;
}

public class Feature {
    Map <String, String> feature;
}

每个SomethingElse都有“颜色”,“品味”等特征的值,每种语言都包含“fr”,“en-US”,“en-UK”,“de”, ...生成的CSV必须如下所示:

id,color.fr,color.en-US,taste.fr,taste.en-US,...

所有用例的区域设置标识符列表都相同。

一种可能的方法是首先序列化为JSON,然后“展平”该JSON,以便可以轻松地将其序列化为CSV。 “扁平化”是指转换:

{
  "foo": {
    "bar": {
      "a": 1,
      "b": 2
    }
  }
}

成:

{
  "foo.bar.a": 1,
  "foo.bar.b": 2
}

换句话说:每个叶子值的键将成为在原始数据结构中访问它所需的JavaScript代码。是否有可以进行此类转换的库方法?

1 个答案:

答案 0 :(得分:1)

从版本2.9.4开始,似乎不支持此功能,请参阅https://github.com/FasterXML/jackson-dataformats-text/tree/master/csv

  

未来的改进:   ...   使用虚线表示法映射嵌套POJO(类似于@JsonUnwrapped,但不需要使用