I think the best option we have here is to create something like a BlockDeviceInfo object with both values, the String and the collection, and have a custom Gson adapter to deserialize that field and populate the right one depending on the json.
On 4 September 2014 07:27, Inbar Stolberg <inbar...@gmail.com> wrote: > What if u use a multi value map? Or a map <String, String[]> or any othe > collectiin type in the value? > Just a thought. > On Sep 4, 2014 12:27 AM, "Everett Toews" <everett.to...@rackspace.com> > wrote: > >> We have a situation uncovered by this issue [1] where the JSON response >> has different value types for String keys in a Map. >> >> For example, >> >> { >> "images": [ >> { >> "id": "cd9d57a9-0978-45f3-9cbc-edb99347be6b", >> "metadata": { >> "block_device_mapping": [ >> { >> "snapshot_id": "a900a56c-61b7-4438-9150-76312fa1aa10", >> "destination_type": "volume", >> "delete_on_termination": null >> } >> ], >> "checksum": "32c08d302f9206668030d47789b77858”, >> ”some_key”: ”some_value”, >> } >> }, >> …. >> } >> >> This is handled by deserialization of this field in the Image domain >> object [2]. Because it’s a Map<String, String> it blows up with an >> exception when it hits the block_device_mapping, which is an array. >> >> IllegalStateException: Expected a string but was BEGIN_ARRAY >> >> Doing something like Map<String, Object> isn’t a great option as it forces >> the caller to constantly check for the type. 99% of the time it’s going to >> be Map<String, String> so it pains me to consider complicating the client >> code for this corner case. >> >> Any thoughts on how to gracefully handle this situation? >> >> Thanks, >> Everett >> >> [1] https://issues.apache.org/jira/browse/JCLOUDS-655 >> [2] >> https://github.com/jclouds/jclouds/blob/master/apis%2Fopenstack-nova%2Fsrc%2Fmain%2Fjava%2Forg%2Fjclouds%2Fopenstack%2Fnova%2Fv2_0%2Fdomain%2FImage.java#L207