2015-04-17 11 views
6

Konwertuję JSON na avro. Mam dane json w JSONArray. Tak więc przy konwertowaniu go na tablicę bajtową napotykam problem.Json na konwersję avro

poniżej jest mój kod:

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 

więc jak mogę to zrobić? Jak przekonwertować obiekt JsonArray na bajty (np. Jak użyć metody getBytes() dla obiektów JsonArray). Powyższy kod powodujący błąd w list.getBytes() i wypowiadanie getBytes() jest undifined dla listy.

Odpowiedz

2

Avro pracuje na rekordowym poziomie, powiązanym ze schematem. Nie wydaje mi się, żeby istniała taka koncepcja, jak "konwertuj ten fragment JSON na bajty dla pola Avro niezależnie od jakiegokolwiek schematu lub rekordu".

Zakładając, że tablica jest częścią większego rekordu JSON, jeśli zaczynasz z ciągiem rekordu, można zrobić

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

dla json on-line do Avro konwerter sprawdzić następujący adres URL

http://avro4s-ui.landoop.com

to przy użyciu biblioteki avro4s który oferuje wiele konwersji, w tym json => avro

Powiązane problemy