【问题标题】:How to create a valid JSON example from Avro Schema?如何从 Avro Schema 创建一个有效的 JSON 示例?
【发布时间】:2018-10-17 21:28:44
【问题描述】:

有一个相当复杂的 Avro 架构(我无法修改)。

尝试在 java 中模拟 JSON 示例:

GenericRecord genericRecord = AvroUtil.jsonToGenericRecord(jsonData, avroSchema);

总是失败:

Exception in thread "main" org.apache.avro.AvroTypeException: Expected start-union. Got VALUE_STRING

是否有例如可以为任何给定的 Avro 模式提供 JSON 数据示例的在线工具? (这样才能正确匹配)

尝试了数小时模拟 JSON 数据,但仍然没有成功..

【问题讨论】:

    标签: json apache-kafka avro


    【解决方案1】:

    你需要导入下面的包

    compile "org.apache.avro:avro:1.8.2"
    compile "org.apache.avro:avro-tools:1.8.2"
    compile "org.apache.avro:trevni-core:1.8.2"
    compile "org.apache.avro:trevni-avro:1.8.2"
    

    【讨论】:

      【解决方案2】:

      您可以使用trevni 依赖项和测试范围创建随机数据。这里有一个示例代码

      import org.apache.avro.Schema;
      import org.apache.trevni.avro.RandomData;
      
      import java.util.Iterator;
      
      public class JSONExample {
          public static void main(String [] args){
              Schema schema = new Schema.Parser().parse("{\n" +
                      "     \"type\": \"record\",\n" +
                      "     \"namespace\": \"com.acme\",\n" +
                      "     \"name\": \"Test\",\n" +
                      "     \"fields\": [\n" +
                      "       { \"name\": \"name\", \"type\": \"string\" },\n" +
                      "       { \"name\": \"age\", \"type\": \"int\" },\n" +
                      "       { \"name\": \"sex\", \"type\": \"string\" },\n" +
                      "       { \"name\": \"active\", \"type\": \"boolean\" }\n" +
                      "     ]\n" +
                      "}");
      
              Iterator<Object> it = new RandomData(schema, 1).iterator();
              System.out.println(it.next());
          }
      }
      

      输出

      {"name": "cjnyvbmetf", "age": -1757126879, "sex": "", "active": false}
      

      maven 依赖

      <dependencies>
          <dependency>
              <groupId>org.apache.avro</groupId>
              <artifactId>avro</artifactId>
              <version>1.8.2</version>
          </dependency>
          <dependency>
              <groupId>org.apache.avro</groupId>
              <artifactId>trevni-core</artifactId>
              <classifier>tests</classifier>
              <version>1.8.2</version>
          </dependency>
          <dependency>
              <groupId>org.apache.avro</groupId>
              <artifactId>trevni-avro</artifactId>
              <classifier>tests</classifier>
              <version>1.8.2</version>
          </dependency>
      </dependencies>
      

      【讨论】:

      • 我这辈子你在哪里? :) 我认为它很棒.. 不完美(一部分仍然需要手动修复),但它非常接近完美.. 谢谢!
      • 欢迎您!很高兴它有效,你是什么意思它需要手动修复?以防万一我可以改进答案。谢谢!
      • 我在enum 类型方面遇到了一个问题。它看起来很好地基于输入 avro 模式生成,但是当尝试创建 genericRecord 时 - 它在为它添加 null 后抱怨 - 全部结果很好..
      • 解析器是获取模式的推荐方法吗?我认为使用 Avro Maven 插件从模式生成类是一个更好的选择
      • 只要您使用相同的模式编译来自 avro maven 插件的类,它应该会产生相同的结果。如果你没有在 mvn 插件中指定它,唯一的区别可能是字符串类型
      猜你喜欢
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多