将Avro生成的对象序列化为json时发生JsonMappingException

Ami*_*mir 5 java serialization json avro

我使用avro-tools使用以下命令从avsc文件生成Java类:

java.exe -jar avro-tools-1.7.7.jar compile -string schema myfile.avsc 
Run Code Online (Sandbox Code Playgroud)

然后,我尝试通过ObjectMapper将此类对象序列化为json,但始终收到一个JsonMappingException,说“不是枚举”或“不是联合”。在测试中,我使用生成器或构造器创建了生成的对象。对于不同类的对象,我得到了这样的例外...

样例代码:

ObjectMapper serializer = new ObjectMapper(); // com.fasterxml.jackson.databind
serializer.register(new JtsModule()); // com.bedatadriven.jackson.datatype.jts
...
return serializer.writeValueAsBytes(avroConvertedObject); // => JsonMappingException
Run Code Online (Sandbox Code Playgroud)

我还使用以下方法尝试了许多配置:serializer.configure(...),但仍然失败。 版本: Java 1.8,jackson-datatype-jts 2.3,jackson-core 2.6.5,jackson-databind 2.6.5,jackson-annotations 2.6.5

有什么建议么?谢谢!

Jar*_*zek 8

如果SCHEMA成员确实是这种情况(我们看不到完整的错误消息),则可以将其关闭。我使用mixin来做到这一点,就像这样:

import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.apache.avro.Schema;
import org.junit.Test;

import java.io.File;
import java.io.IOException;

public class AvroGenerTests
{
  abstract class IgnoreSchemaProperty
  {
    // You have to use the correct package for JsonIgnore,
    // fasterxml or codehaus
    @JsonIgnore abstract void getSchema();
  }

  @Test
  public void writeJson() throws IOException {
    BookAvro b = BookAvro.newBuilder()
      .setTitle("Wilk stepowy")
      .setAuthor("Herman Hesse")
      .build();
    ObjectMapper om = new ObjectMapper();
    om.enable(SerializationFeature.INDENT_OUTPUT);
    om.addMixIn(BookAvro.class, IgnoreSchemaProperty.class);
    om.writeValue(new File("plik_z_gen.json"), b);
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 我尝试了类似的方法,但是,我收到 com.fasterxml.jackson.databind.JsonMappingException: Infinite recursion (StackOverflowError) (3认同)

Jos*_*ino 5

2022 Avro 字段名称

abstract class IgnoreSchemaPropertyConfig {
   // You have to use the correct package for JsonIgnore,
   // fasterxml or codehaus
   @JsonIgnore
   abstract void getClassSchema();

   @JsonIgnore
   abstract void getSpecificData();

   @JsonIgnore
   abstract void get();

   @JsonIgnore
   abstract void getSchema();
}


public class AvroGenerateJSON
{
 
  public String convertToJson() throws IOException {
    ObjectMapper om = new ObjectMapper();
    om.addMixIn(BookAvro.class,IgnoreSchemaPropertyConfig.class);
  }
}
Run Code Online (Sandbox Code Playgroud)