web-dev-qa-db-ja.com

JSONからAVRへの変換

Jsonをavroに変換しています。 JSONArrayにjsonデータがあります。それをバイト配列に変換している間、私は問題に直面しています。

以下は私のコードです:

_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オブジェクトをバイトに変換する方法(つまり、JsonArrayオブジェクトにgetBytes()メソッドを使用する方法)。上記のコードでは、list.getBytes()でエラーが発生し、getBytes()がリストに対して未定義です。

8
shree11

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

Jsonからavroへのオンラインコンバーターについては、次のURLを確認してください。

http://avro4s-ui.landoop.com

Json => avroを含む多くの変換を提供するライブラリ avro4s を使用しています

この議論はおそらく役に立ちます:

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

要点は、特別なJsonスキーマがあり、JsonReader/Writerを使用してそこにアクセスできることです。使用するJsonスキーマは次のように定義されています。

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

3
ppearcy