Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Jackson writing object twice

Tags:

java

json

jackson

I have the following class which contains a String field and a Map field. I want to use Jackson to serialize it to json.

public class Mapping 

    private String mAttribute;

    @JsonIgnore
    private Map<String, String> mMap;

    @JsonAnyGetter
    public Map<String, String> getMap() {
        //some logic to populate map
    }

    @JsonAnySetter
    public void put(// some params) {
        //some more logic
    }

    @JsonProperty(value = "attribute")
    public String getAttribute() {
        return mAttribute;
    }

    public void setAttribute(String aAttribute) {
        mAttribute= aAttribute;
    }
}

I instantiate a Mapping object and then use ObjectMapper to write it to a file.

ObjectMapper om = new ObjectMapper();
om.writeValue(destFile, myMappingObject);

For some reason, it's writing the Mapping instance myMappingObject twice. I'm assuming I've not set some visibility option somewhere but I don't know where.

The json looks like this, only it comes up twice in the file.

{
    "attribute" : "someValue",
    "map-key1" : "map-value1",
    "map-key2" : "map-value2"
}

There's this, but apparently it was fixed in previous version of Jackson. I also tried changing the name of the method to random() and it still gets called twice (the number of times it should).

like image 786
Sotirios Delimanolis Avatar asked Oct 16 '25 10:10

Sotirios Delimanolis


1 Answers

The problem had nothing to do with the above class. I was using another class that had a list of Mappings. Before:

public class MappingsList {
    @JsonProperty
    private List<Mapping> mappings;

    public List<Mapping> getMappings() {return mappings;}
}

After:

public class MappingsList {        
    private List<Mapping> mappings;

    @JsonProperty
    public List<Mapping> getMappings() {return mappings;}
}

And it worked. The cause is that the ObjectMapper was seeing two (2) properties in the MappingsList class and therefore doing serialization on both. First it would create json for the mappings field and then again for the getMappings() method.

like image 146
Sotirios Delimanolis Avatar answered Oct 18 '25 22:10

Sotirios Delimanolis



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!