KEMBAR78
avro serialization of pojo with dynamic @JsonAnyGetter fields · Issue #75 · FasterXML/jackson-dataformats-binary · GitHub
Skip to content

avro serialization of pojo with dynamic @JsonAnyGetter fields #75

@antonymayi

Description

@antonymayi

Is it possible to serialize pojo with dynamic fields implemented using @JsonAnyGetter? This currently fails:

static class POJO {
    private final Map<String, Object> params = new HashMap<>();
    @JsonAnyGetter public Map<String, Object> any() {
        return this.params;
    }
    @JsonAnySetter public void set(String name, Object value) {
        this.params.put(name, value);
    }
    public Object get(String name) {
        return this.params.get(name);
    }
}

public void testAvro() throws IOException {
    ObjectMapper jsonMapper = new ObjectMapper(new JsonFactory());
    ObjectMapper avroMapper = new ObjectMapper(new AvroFactory());
    AvroSchemaGenerator gen = new AvroSchemaGenerator();
    avroMapper.acceptJsonFormatVisitor(POJO.class, gen);
    AvroSchema schema = gen.getGeneratedSchema();
    POJO orig = jsonMapper.readValue("{\"foo\": \"a\", \"bar\": 2, \"baz\": false}", POJO.class);
    byte binary[] = avroMapper.writer(schema).writeValueAsBytes(orig);
    POJO clone = avroMapper.reader(POJO.class).with(schema).readValue(binary);
}

That throws following:

Caused by: java.lang.IllegalStateException: No field named 'bar'
at com.fasterxml.jackson.dataformat.avro.ser.ObjectWriteContext._reportUnknownField(ObjectWriteContext.java:132)
at com.fasterxml.jackson.dataformat.avro.ser.ObjectWriteContext.writeFieldName(ObjectWriteContext.java:67)
at com.fasterxml.jackson.dataformat.avro.AvroGenerator.writeFieldName(AvroGenerator.java:285)
at com.fasterxml.jackson.databind.ser.std.StdKeySerializers$StringKeySerializer.serialize(StdKeySerializers.java:220)
at com.fasterxml.jackson.databind.ser.std.MapSerializer.serializeFields(MapSerializer.java:610)
at com.fasterxml.jackson.databind.ser.AnyGetterWriter.getAndSerialize(AnyGetterWriter.java:61)
at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:694)
... 29 more

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions