将avro生成的对象序列化为json时出现JsonMappingException

时间:2016-09-06 13:04:02

标签: java json serialization avro

我使用avro-tools从avsc文件生成java类,使用:

java.exe -jar avro-tools-1.7.7.jar compile -string schema myfile.avsc 

然后我尝试通过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

我还尝试了很多配置: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

有什么建议吗? 谢谢!

4 个答案:

答案 0 :(得分:6)

如果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);
  }
}

答案 1 :(得分:1)

https://www.programcreek.com/java-api-examples/?api=org.apache.avro.io.JsonEncoder 找到代码示例后,我编写了一个方法,可以将任何给定的 Avro 对象(它们扩展 GenericRecord)转换为 Json 字符串。代码:

=ARRAYFORMULA(IFNA(VLOOKUP(A2:A&B2:B&C2:C; 
 {Inkoop!D2:D&Inkoop!E2:E&Inkoop!F2:F\ Inkoop!G2:G}; 2; 0)))

答案 2 :(得分:1)

我的要求发生了变化,有人告诉我需要将 Avro 对象直接转换为 JSON,而不保留任何元数据。我在此指定了一个方法 convertToJsonString 的另一个答案将整个 Avro 对象转换为 JSON,以便使用解码器可以将原始 Avro 对象重新创建为 Avro 对象。那不是我的mgt。不再想要了,所以我又回到了旧的绘图板。

作为 Hail Mary 通行证,我尝试使用 Gson,它可以完成我现在必须做的事情。很简单:

 Gson gson = new Gson();
 String theJsonString = gson.toJson(object_ur_converting);

大功告成。

答案 3 :(得分:0)

上一篇文章正确回答了这个问题。我只是补充上一个答案。在将它作为正文发送到POST请求中之前,我没有将其写入文件,而是将其转换为字符串。

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

  public String convertToJson() 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);
    String jsonString = om.writeValueAsString(b);
    return jsonString;
  }
}