[ 
https://issues.apache.org/jira/browse/CAMEL-26085?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Claus Ibsen resolved CAMEL-26085.
---------------------------------
    Resolution: Fixed

Fixed by https://github.com/apache/camel/pull/28593 (merged as a6092f243dd1).

_Claude Code on behalf of davsclaus_

> camel-csv - marshalling a List<Map> without a header puts the values of a row 
> in the wrong columns when its keys are in another order or one is missing
> -------------------------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: CAMEL-26085
>                 URL: https://issues.apache.org/jira/browse/CAMEL-26085
>             Project: Camel
>          Issue Type: Bug
>          Components: camel-csv
>            Reporter: shashank
>            Assignee: shashank
>            Priority: Major
>             Fix For: 4.24.0
>
>
> When no {{header}} is set (or {{headerDisabled=true}}, which drops it), 
> {{CsvMarshaller.DynamicColumnsMarshaller}} writes each map of a {{List<Map>}} 
> body with {{map.values()}}, so in the iteration order of that map (main 
> 6a2f66ddec3e). Within one body the column of a key depends on each row: 
> {{[{id=1, name=Alice, city=Oslo}, {name=Bob, city=Rome, id=2}]}} gives 
> {{1,Alice,Oslo}} and {{Bob,Rome,2}}; {{[{id=1, name=Alice, city=Oslo}, {id=2, 
> city=Rome}]}} gives {{2,Rome}}, so {{Rome}} is under {{name}}. No error and 
> no header line to notice it by. It happens when JSON objects or documents are 
> marshalled to CSV ({{unmarshal().json()}} then {{marshal().csv()}}, MongoDB 
> documents, Jackson {{NON_NULL}}): the system that imports the file reads 
> values in the wrong columns. Camel 2.15 kept a set of columns in the 
> marshaller; commit bbc905eb6f (2.16) removed it because it was shared by all 
> exchanges, and the alignment inside one body went with it. 
> camel-univocity-parsers aligns by key for the same body.
> *Fix*: {{CsvMarshaller.marshal}} asks a new protected 
> {{createMapRecordValues()}} once per body (default {{getMapRecordValues}}, so 
> custom marshallers work as before). {{DynamicColumnsMarshaller}} keeps the 
> columns of the body: the keys of the first map, then the keys of later maps 
> that the first one does not have, in the order they first appear; a missing 
> key is a null value (an empty field, or {{nullString}}). Nothing is kept 
> across bodies. The data format page says how the columns are chosen; upgrade 
> guide 4.24 entry.
> *Tests*: new {{CsvMarshalMapRowsColumnOrderTest}}, 5 tests; 4 fail on main, 
> for example {{array contents differ at index [1], expected: <2,Bob,Rome> but 
> was: <Bob,Rome,2>}} and {{expected: <2,,Rome> but was: <2,Rome>}}; the 
> control that each body has its own columns passes on main. Unit tests of 
> camel-csv with the fix: 98 run, 0 failures.
> *How it was found*: a reference differential of the CSV data formats against 
> an RFC 4180 model and univocity.
> *Affected*: main, camel-4.23.x, camel-4.22.x, camel-4.18.x and camel-4.14.x 
> (same marshaller). Read, not run.
> _Filed with Claude Code on behalf of allthingssecurity._



--
This message was sent by Atlassian Jira
(v10.3.26#10030026)

Reply via email to