web-dev-qa-db-fra.com

Conversion JSON en AVRO

Je convertis Json en AVRO. J'ai json données dans JSONArray. Ainsi, lors de la conversion en tableau d'octets, je suis confronté au problème.

ci-dessous est mon 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

Alors, comment puis-je le faire? Comment convertir un objet JsonArray en octets (par exemple, comment utiliser la méthode getBytes () pour des objets JsonArray). Le code ci-dessus donnant une erreur à list.getBytes() et disant que getBytes () est indéfini pour list.

7
shree11

Avro fonctionne au niveau de l'enregistrement, lié à un schéma. Je ne pense pas qu'il existe un concept tel que "convertir ce fragment JSON en octets pour un champ Avro indépendant de tout schéma ou enregistrement".

En supposant que le tableau fasse partie d’un enregistrement JSON plus volumineux, si vous commencez par une chaîne de l’enregistrement, vous pouvez le faire.

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) { }
    }
}
5
Keegan

Pour un convertisseur JSON en AVRO en ligne, vérifiez l'URL suivante

http://avro4s-ui.landoop.com

Il utilise la bibliothèque avro4s qui offre de nombreuses conversions, notamment json => avro 

5

Cette discussion est probablement utile:

http://mail-archives.Apache.org/mod_mbox/avro-user/201209.mbox/%3CCALEq1Z8s1sfaAVB7YE2rpZ=v3q1V_h7Vm39h0HsOzxJ+qfQRSg@mail.gmail.com%3E

En résumé, il existe un schéma Json spécial et vous pouvez utiliser JsonReader/Writer pour y accéder. Le schéma Json que vous devez utiliser est défini ici:

https://github.com/Apache/avro/blob/trunk/share/schemas/org/Apache/avro/data/Json.avsc

2
ppearcy