Jackson XML for JSON not formatting lists correctly

I am converting the original XML input to JSON, and I am having problems with the desired output structure (lists do not display correctly). The imported XML structure may differ from the example below, so using POJO and simply annotating is not possible. An example of XML input below:

<?xml version="1.0" encoding="UTF-8" standalone="no"?> <gang> <id>435dfb3f-1129-4375-b0f9-09955d7434cc</id> <name>Brew Crews</name> <members> <member> <member>d3433b1c-a93d-4af1-b698-89fcd921e48d</member> <dateJoined/> </member> <member> <member>8ac9f5bc-5710-4cb1-a75d-839e211f0286</member> <dateJoined/> </member> </members> <anthem/> <logo>http://localhost:8080/cloud/master-index-record/raw/58338b91-2390-44a7-ac31-581c5dd921e1</logo> </gang> 

I use Jackson to convert XML to JSON (XML is already a string and is represented by the variable 'result')

 XmlMapper xmlMapper = new XmlMapper(); Object entry = xmlMapper.readValue(result, Object.class); ObjectMapper jsonMapper = new ObjectMapper(); return jsonMapper.writeValueAsString(entry); 

The following JSON is produced:

 { "id": "435dfb3f-1129-4375-b0f9-09955d7434cc", "name": "Brew Crews", "members": { "member": { "member": "8ac9f5bc-5710-4cb1-a75d-839e211f0286", "dateJoined": null } }, "anthem": null, "logo": "http://localhost:8080/cloud/master-index-record/raw/58338b91-2390-44a7-ac31-581c5dd921e1" } 

My problem is that the members members should be grouped into a JSON array as follows:

 "members":[{"member":blah,"dateJoined":null},{"member":blah2,"dateJoined":null}] 

But they are not ... is there any specific configuration that needs to be done for an XML map or Mapper object to achieve these desired results?

+5
source share
1 answer

Jackson will not be able to handle generic types such as Object s at all. When you do that -

 Object entry = xmlMapper.readValue(result, Object.class); 

Jackson does not know the structure of the object that he must deserialize.

You can try this -

 class Member { private String memberId; private String dateJoined; } class Gang { private String id; private String name; private List<Member> members; private String anthem; private String logo; } class Test { public static void main(String[] args) { String result = "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\"?><Gang><id>435dfb3f-1129-4375-b0f9-09955d7434cc</id><name>Brew Crews</name><members><member><memberId>d3433b1c-a93d-4af1-b698-89fcd921e48d</memberId><dateJoined/></member><member><memberId>8ac9f5bc-5710-4cb1-a75d-839e211f0286</memberId><dateJoined/></member></members><anthem/><logo>http://localhost:8080/cloud/master-index-record/raw/58338b91-2390-44a7-ac31-581c5dd921e1</logo></Gang>"; XmlMapper xmlMapper = new XmlMapper(); xmlMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); Object entry = xmlMapper.readValue(result, Gang.class); ObjectMapper jsonMapper = new ObjectMapper(); jsonMapper.setVisibility(PropertyAccessor.FIELD, Visibility.ANY); System.out.println(jsonMapper.writeValueAsString(entry)); } } 
+1
source

Source: https://habr.com/ru/post/1235561/


All Articles