Skip to content

JsonNode.deepCopy() ClassCastException`s #1829

@D3v01dZA

Description

@D3v01dZA

The current signature of JsonNode#deepCopy looks like this:

public abstract <T extends JsonNode> T deepCopy();

I wondered about the decision to do this as you can quite easily create a ClassCastException using this as follows:

TextNode text = TextNode.valueOf("SomeText");
ObjectNode object = text.deepCopy();

This code is obviously incorrect just by looking at it however this will always compile and throw an exception at runtime. I know this is considered an API change but a signature that prevents this might be:

JsonNode.java
public abstract JsonNode deepCopy();

And then be overridden on each subclass with the correct type

ValueNode.java
public abstract ValueNode deepCopy();

After looking at this again, the signatures of ObjectNode and ArrayNode are correct but you can still trick it by upcasting to JsonNode and then using deepCopy()

Activity

cowtowncoder

cowtowncoder commented on Nov 16, 2017

@cowtowncoder
Member

Hmmh. Yes, it would be possible to use return type co-variance here. This could be done for Jackson 3.x (as it can not be done for 2.x; not something that can go in a patch, and 2.9 is the last 2.x minor version).

added
3.xIssues to be only tackled for Jackson 3.x, not 2.x
on Nov 16, 2017
cowtowncoder

cowtowncoder commented on Jul 28, 2022

@cowtowncoder
Member

lol on "2.9 is the last". We are at 2.13 now... :)

Still, if done, this needs to go in 3.0.

added
3.0Issue planned for initial 3.0 release
and removed
3.xIssues to be only tackled for Jackson 3.x, not 2.x
on Dec 1, 2024
changed the title [-]JsonNode#deepCopy ClassCast Exceptions[/-] [+]`JsonNode.deepCopy() `ClassCastException`s[/+] on Dec 5, 2024
added this to the 3.0.0 milestone on Dec 5, 2024
added 2 commits that reference this issue on Dec 5, 2024
58bb8ad
12f5afc
cowtowncoder

cowtowncoder commented on Dec 12, 2024

@cowtowncoder
Member

Fixed.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    3.0Issue planned for initial 3.0 release

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @cowtowncoder@D3v01dZA

        Issue actions

          `JsonNode.deepCopy() `ClassCastException`s · Issue #1829 · FasterXML/jackson-databind