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()がリストに対して未定義です。
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) { }
}
}
Jsonからavroへのオンラインコンバーターについては、次のURLを確認してください。
Json => avroを含む多くの変換を提供するライブラリ avro4s を使用しています
この議論はおそらく役に立ちます:
要点は、特別なJsonスキーマがあり、JsonReader/Writerを使用してそこにアクセスできることです。使用するJsonスキーマは次のように定義されています。
https://github.com/Apache/avro/blob/trunk/share/schemas/org/Apache/avro/data/Json.avsc