2015-04-17 13 views
6

Tôi đang chuyển đổi Json sang chế độ giới thiệu. Tôi có dữ liệu json trong JSONArray. Vì vậy, trong khi chuyển đổi nó thành mảng byte tôi đang đối mặt với vấn đề.Json to avro conversion

dưới đây là mã của tôi:

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 

Vậy làm thế nào tôi có thể làm điều đó? Làm thế nào để chuyển đổi đối tượng JsonArray thành byte (ví dụ, cách sử dụng phương thức getBytes() cho các đối tượng JsonArray). Đoạn mã trên đưa ra lỗi tại số list.getBytes() và nói getBytes() bị hủy cho danh sách.

Trả lời

2

Avro hoạt động ở cấp bản ghi, được liên kết với giản đồ. Tôi không nghĩ rằng có một khái niệm như "chuyển đổi đoạn JSON này thành các byte cho một trường Avro độc lập với bất kỳ lược đồ hoặc bản ghi nào".

Giả sử mảng là một phần của một kỷ lục JSON lớn hơn, nếu bạn đang bắt đầu với một chuỗi các bản ghi, bạn có thể làm

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) { } 
    } 
} 
4

Đối với một json trực tuyến để chuyển đổi Avro kiểm tra URL sau

http://avro4s-ui.landoop.com

Nó được sử dụng thư viện avro4s cung cấp một nhiều chuyển đổi bao gồm json => avro