Things I dislike about Ion, having used it while at Amazon:<p>- IonValues are mutable by default. I saw bugs where cached IonValues were accidentally changed, which is easy to do: IonSequence.extract clears the sequence [1], adding an IonValue to a container mutates the value (!) [2], etc.<p>- IonValues are not thread-safe [3]. You can call makeReadOnly() to make them immutable, but then you&#x27;ll be calling clone since doing anything useful (like adding it to a list) will need to mutate the value. While it says IonValues are not even thread-safe for reading, I believe this is not strictly true. There was an internal implementation that would lazily materialize values on read, but it doesn&#x27;t look like it&#x27;s included in the open source version.<p>- IonStruct can have multiple fields with the same name, which means it can&#x27;t implement Map. I&#x27;ve never seen anyone use this (mis)feature in practice, and I don&#x27;t know where it would be useful.<p>- Since IonStruct can&#x27;t implement Map, you don&#x27;t get the Java 8 default methods like forEach, getOrDefault, etc.<p>- IonStruct doesn&#x27;t implement keySet, values, spliterator, or stream, and thus doesn&#x27;t play well with the Java 8 Stream API.<p>- Calling get(fieldName) on an IonStruct returns null if the field isn&#x27;t present. But the value might also be there and be null, so you end up having to do a null check AND call isNullValue(). I&#x27;m not convinced it&#x27;s a worthwhile distinction, and would have preferred a single way of doing it. You can already call containsKey to check for the presence of a field.<p>- In practice most code that dealt with Ion was nearly as tedious and verbose as pulling values out of an old-school JSONObject. Every project seemed to have a slightly different IonUtils class for doing mundane things like pulling values out of structs, doing all the null checks, casting, etc. There was some kind of adapter for Jackson that would allow you to deserialize to a POJO, but it didn&#x27;t seem like it was widely used.<p>[1] <a href="https:&#x2F;&#x2F;github.com&#x2F;amznlabs&#x2F;ion-java&#x2F;blob&#x2F;master&#x2F;src&#x2F;software&#x2F;amazon&#x2F;ion&#x2F;IonSequence.java#L457" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;amznlabs&#x2F;ion-java&#x2F;blob&#x2F;master&#x2F;src&#x2F;softwar...</a><p>[2] <a href="https:&#x2F;&#x2F;github.com&#x2F;amznlabs&#x2F;ion-java&#x2F;blob&#x2F;master&#x2F;src&#x2F;software&#x2F;amazon&#x2F;ion&#x2F;IonValue.java#L103-L112" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;amznlabs&#x2F;ion-java&#x2F;blob&#x2F;master&#x2F;src&#x2F;softwar...</a><p>[3] <a href="https:&#x2F;&#x2F;github.com&#x2F;amznlabs&#x2F;ion-java&#x2F;blob&#x2F;master&#x2F;src&#x2F;software&#x2F;amazon&#x2F;ion&#x2F;IonValue.java#L119-L140" rel="nofollow">https:&#x2F;&#x2F;github.com&#x2F;amznlabs&#x2F;ion-java&#x2F;blob&#x2F;master&#x2F;src&#x2F;softwar...</a>