Json转换为Avro

10

我正在将Json转换为Avro。 我的json数据在JSONArray中。 在将其转换为字节数组时,我遇到了问题。

以下是我的代码:

static byte [] fromJsonToAvro(JSONArray json, String schemastr) throws Exception {

ExcelToJson ejj = new ExcelToJson();
List<String> list = new ArrayList<String>();


if (json != null) { 
    int len = json.length();
    for (int i=0;i<len;i++){ 
        list.add(json.get(i).toString());
    } 
}


InputStream input = new ByteArrayInputStream(list.getBytes()); //json.toString().getBytes()

 DataInputStream din = new DataInputStream(input); 
                  .
                  . 
                  .//rest of the logic

那么我该怎么做呢? 如何将JsonArray对象转换为字节(即如何使用getBytes()方法处理JsonArray对象)。上述代码在list.getBytes()处报错,并提示list未定义getBytes()方法。

3个回答

10

Avro工作在记录级别上,与模式绑定。我认为不存在这样的概念:“将此JSON片段转换为Avro字段的字节,而不依赖于任何模式或记录。”

假设数组是较大的JSON记录的一部分,如果您从记录的字符串开始,可以执行以下操作:

public static byte[] jsonToAvro(String json, String schemaStr) throws IOException {
    InputStream input = null;
    DataFileWriter<GenericRecord> writer = null;
    Encoder encoder = null;
    ByteArrayOutputStream output = null;
    try {
        Schema schema = new Schema.Parser().parse(schemaStr);
        DatumReader<GenericRecord> reader = new GenericDatumReader<GenericRecord>(schema);
        input = new ByteArrayInputStream(json.getBytes());
        output = new ByteArrayOutputStream();
        DataInputStream din = new DataInputStream(input);
        writer = new DataFileWriter<GenericRecord>(new GenericDatumWriter<GenericRecord>());
        writer.create(schema, output);
        Decoder decoder = DecoderFactory.get().jsonDecoder(schema, din);
        GenericRecord datum;
        while (true) {
            try {
                datum = reader.read(null, decoder);
            } catch (EOFException eofe) {
                break;
            }
            writer.append(datum);
        }
        writer.flush();
        return output.toByteArray();
    } finally {
        try { input.close(); } catch (Exception e) { }
    }
}

9

如果需要在线的JSON转AVRO转换器,请访问以下网址:

http://avro4s-ui.landoop.com

该网站使用了avro4s 库,该库提供了很多类型之间的转换,包括JSON转AVRO


这个有没有对应的API? - shakeel
2
转换器似乎不再起作用了,当我更改示例时,它不会更改其输出。 - Suzana

4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接