FasterXML / jackson-dataformats-text

Uber-project for (some) standard Jackson textual format backends: csv, properties, yaml (xml to be added in future)
Apache License 2.0
405 stars 149 forks source link

Add an option to serialize List<String> as "comma,separated,value" #1

Open cowtowncoder opened 7 years ago

cowtowncoder commented 7 years ago

(note: moved from https://github.com/FasterXML/jackson-dataformat-properties/issues/5)

Comma-separated lists are quite common in property or .ini style configuration files. The only way I found to generate/parse these with JavaPropsMapper is to annotate a custom value class with @JsonCreator and @JsonValue, but this also affects other data formats that do have a proper list representation. If I want to convert between .ini and json/yaml/xml, it gets quite messy.

I would like to propose (and help with) the following feature: Arrays or lists of primitive types can be configured to be serialized and deserialized as CSV (Split at configurable delimiter, strip whitespace around delimiter, do not split or remove whitespace within quoted strings, remove quotes from quoted strings).

This would make *.ini style configuration a real alternative to json/yaml/xml for some use cases.

cowtowncoder commented 7 years ago

Yes, agreed. Timely RFE as well, due to:

https://github.com/FasterXML/jackson-databind/pull/1364

which is for the same thing, but applying generally, via @JsonFormat. There are some open questions on possibly configuration, how to make serialization also work, and a thread on jackson-dev trying to figure out what would be the best way to go.

I don't think a ton of configuration would be needed, but seems like separator char (comma, semicolon, space, sometimes pipe) may vary, and perhaps what whitespace to allow/add before/after separator.

Questing of possible quoting of values within is an interesting one and I hadn't considered that. I know that CSV does that, but haven't seen widely used with other formats.

TWiStErRob commented 4 years ago

This would be useful for XML too.

My current workaround is:

data class SplitStringValues(
    /**
     * @sample `"a,bb,ccc"`
     */
    val vals: String
) {

    constructor(vals: List<String>) : this(vals.joinToString(","))

    @JsonIgnore
    val valList = vals.split(",")
}
<SplitStringValues>
    <vals>a,bb,ccc</vals>
</SplitStringValues>

but this gets hairy if vals is an attribute among other properties on a bigger object.

Pytry commented 3 years ago

Just wondering is anything has been done on this or not?

cowtowncoder commented 3 years ago

If something is done, something is noted on the issue typically. I am not aware of any related work.

PRs welcome.