Alex Smoke
Alex Smoke

Reputation: 669

Jackson JSON Custom Serialization of Map with top level value

I need to serialize the following class:

@JsonSerialize(using = ItemSerializer.class)
public class Project {
    @JsonProperty
    public Map<String, Field> fields = new HashMap<String, Field>();
} 

The Field class:

public class Field {
    public String name;
    @JsonIgnore
    public boolean isStringField;
    public Field(String name, boolean isStringField) {
        this.name = name;
        this.isStringField = isStringField;
    }
}

Serialize function:

@Override
public void serialize(...) throws ... {
    jgen.writeStartObject();       
    for(Map.Entry<String, Field> entry : value.fields.entrySet()){
        if(entry.getValue().isStringField){
            jgen.writeStringField(entry.getKey(), entry.getValue().name);
        }else{
            jgen.writeObjectField(entry.getKey(), entry.getValue());
        }
    }
    jgen.writeEndObject();

JSON I'm getting is almost what I need:

{
   "fieldValue4": {
   "name": "field4"
  },
   "fieldValue3": {
   "name": "field3"
  },
   "fieldValue2": {
   "name": "field2"
  },
  "fieldValue1": "field1"
}

Except that parent element named fileds (variable name from Project class)is not in this JSON. How can I add it to the result JSON to get something like:

{
    "fields": {
        "fieldValue4": {
        "name": "field4"
        },
        "fieldValue3": {
        "name": "field3"
        },
        "fieldValue2": {
        "name": "field2"
        },
        "fieldValue1": "field1"
     }
}

Upvotes: 1

Views: 1568

Answers (1)

JChrist
JChrist

Reputation: 1752

Since you have already specified your own custom serializer, then it is just a matter of specifying gen.writeObjectFieldStart("fields");, before serializing your fields map

Upvotes: 2

Related Questions