2015-04-17 7 views
6

Ich konvertiere Json in avro. Ich habe JSON Daten in JSONArray. Also, während ich es in Byte-Array umwandle, stehe ich vor dem Problem.Json zu avro Umwandlung

unten ist mein Code:

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 

So, wie ich es tun kann? Wie man das JsonArray-Objekt in Bytes umwandelt (d. H., Wie man die Methode getBytes() für JsonArray-Objekte verwendet). Der obige Code gibt einen Fehler bei list.getBytes() und sagt getBytes() ist für Liste nicht definiert.

Antwort

2

Avro arbeitet auf Datensatzebene, gebunden an ein Schema. Ich glaube nicht, dass es ein solches Konzept gibt wie "Konvertiere dieses JSON-Fragment in Bytes für ein Avro-Feld unabhängig von irgendeinem Schema oder Datensatz".

das Array Unter der Annahme, ist Teil eines größeren JSON Datensatz, wenn Sie mit einer Zeichenfolge des Datensatz fangen, könnten Sie tun

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

Für ein Online-json zu Avro-Wandler

die folgende URL überprüfen http://avro4s-ui.landoop.com

Es ist die Bibliothek mit avro4s, die eine bietet Viele Konvertierungen einschließlich JSON => Avro