Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Memproses hasil kueri Amazon RDS Data API dalam format JSON
Ketika Anda memanggil operasi ExecuteStatement
, Anda dapat memilih untuk menampilkan hasil kueri sebagai string dalam format JSON. Dengan demikian, Anda dapat menggunakan kemampuan parsing JSON bahasa pemrograman Anda untuk menafsirkan dan memformat ulang set hasil. Dengan melakukan ini, Anda dapat membantu menghindari penulisan kode tambahan untuk mengulang set hasil dan menafsirkan setiap nilai kolom.
Untuk meminta set hasil dalam format JSON, teruskan parameter formatRecordsAs
opsional dengan nilai JSON
. Set hasil yang diformat JSON ditampilkan di bidang formattedRecords
struktur ExecuteStatementResponse
.
Tindakan BatchExecuteStatement
tidak menampilkan set hasil. Dengan demikian, opsi JSON tidak berlaku untuk tindakan itu.
Untuk menyesuaikan kunci dalam struktur hash JSON, tentukan alias kolom dalam set hasil. Anda dapat melakukannya dengan menggunakan klausa AS
dalam daftar kolom kueri SQL Anda.
Anda dapat menggunakan kemampuan JSON untuk membuat set hasil lebih mudah dibaca dan memetakan kontennya ke kerangka kerja khusus bahasa. Karena volume set hasil berenkode ASCII lebih besar dari representasi default, Anda dapat memilih representasi default untuk kueri yang menampilkan sejumlah besar baris atau nilai kolom besar yang menghabiskan lebih banyak memori daripada yang tersedia untuk aplikasi Anda.
Mengambil hasil kueri dalam format JSON
Untuk menerima hasil yang ditetapkan sebagai string JSON, sertakan .withFormatRecordsAs(RecordsFormatType.JSON)
dalam ExecuteStatement
panggilan. Nilai pengembalian kembali sebagai string JSON di bidang formattedRecords
. Dalam kasus ini, columnMetadata
bernilai null
. Label kolom adalah kunci dari objek yang mewakili setiap baris. Nama kolom ini diulang untuk setiap baris dalam set hasil. Nilai kolom adalah string berkutip, nilai numerik, atau nilai khusus yang merepresentasikan true
, false
, atau null
. Metadata kolom seperti batasan panjang dan tipe yang tepat untuk angka dan string tidak dipertahankan dalam respons JSON.
Jika Anda menghilangkan panggilan .withFormatRecordsAs()
atau menentukan parameter NONE
, set hasil ditampilkan dalam format biner menggunakan bidang Records
dan columnMetadata
.
Pemetaan Tipe Data
Nilai SQL dalam set hasil dipetakan ke set tipe JSON yang lebih kecil. Nilai direpresentasikan dalam JSON sebagai string, angka, dan beberapa konstanta khusus seperti true
, false
, dan null
. Anda dapat mengonversi nilai-nilai ini menjadi berbagai variabel dalam aplikasi Anda, dengan menggunakan pengetikan kuat atau lemah yang sesuai untuk bahasa pemrograman Anda.
Tipe data JDBC |
Tipe data JSON |
---|---|
|
Angka secara default. String jika opsi |
|
Angka |
|
String secara default. Angka jika opsi |
|
String |
|
Boolean |
|
String dalam enkode base64. |
|
String |
|
Array |
|
|
Tipe lainnya (termasuk tipe terkait tanggal dan waktu) |
String |
Pemecahan Masalah
Respons JSON dibatasi hingga 10 megabyte. Jika responsnya lebih besar dari batas ini, program Anda menerima kesalahan BadRequestException
. Dalam kasus ini, Anda dapat mengatasi kesalahan menggunakan salah satu teknik berikut:
-
Kurangi jumlah baris di set hasil. Untuk melakukannya, tambahkan klausa
LIMIT
. Anda dapat membagi set hasil besar menjadi beberapa set yang lebih kecil dengan mengirimkan beberapa kueri dengan klausaLIMIT
danOFFSET
.Jika set hasil menyertakan baris yang difilter oleh logika aplikasi, Anda dapat menghapus baris tersebut dari set hasil dengan menambahkan kondisi lainnya dalam klausa
WHERE
. -
Kurangi jumlah kolom di set hasil. Untuk melakukannya, hapus item dari daftar pilih kueri.
-
Persingkat label kolom dengan menggunakan alias kolom dalam kueri. Setiap nama kolom diulang dalam string JSON untuk setiap baris dalam set hasil. Oleh karena itu, hasil kueri dengan nama kolom panjang dan banyak baris dapat melebihi batas ukuran. Khususnya, gunakan alias kolom untuk ekspresi rumit agar seluruh ekspresi tidak diulang dalam string JSON.
-
Meskipun Anda dapat menggunakan alias kolom dengan SQL untuk menghasilkan set hasil yang memiliki beberapa kolom dengan nama yang sama, nama kunci duplikat tidak diperbolehkan di JSON. RDS API Data menampilkan kesalahan jika Anda meminta set hasil dalam format JSON dan beberapa kolom memiliki nama yang sama. Jadi, pastikan semua label kolom memiliki nama yang unik.
Contoh
Contoh Java berikut menunjukkan cara memanggil ExecuteStatement
dengan respons sebagai string berformat JSON, lalu menafsirkan set hasil. Gantikan nilai yang sesuai untukdatabaseName
,secretStoreArn
, dan clusterArn
parameter.
Contoh Java berikut menunjukkan kueri yang menampilkan nilai numerik desimal di set hasil. Panggilan assertThat
menguji apakah bidang respons memiliki properti yang diharapkan berdasarkan aturan untuk set hasil JSON.
Contoh ini bekerja dengan skema dan data sampel berikut:
create table test_simplified_json (a float); insert into test_simplified_json values(10.0);
public void JSON_result_set_demo() { var sql = "select * from test_simplified_json"; var request = new ExecuteStatementRequest() .withDatabase(
databaseName
) .withSecretArn(secretStoreArn
) .withResourceArn(clusterArn
) .withSql(sql) .withFormatRecordsAs(RecordsFormatType.JSON); var result = rdsdataClient.executeStatement(request); }
Nilai bidang formattedRecords
dari program sebelumnya adalah:
[{"a":10.0}]
Bidang Records
dan ColumnMetadata
dalam respons keduanya bernilai null karena adanya set hasil JSON.
Contoh Java berikut menunjukkan kueri yang menampilkan nilai numerik integer di set hasil. Contoh panggilan getFormattedRecords
untuk menampilkan hanya string berformat JSON dan mengabaikan bidang respons lain yang kosong atau bernilai null. Contoh ini melakukan deserialisasi hasil ke dalam struktur yang merepresentasikan daftar catatan. Setiap catatan memiliki bidang yang namanya sesuai dengan alias kolom dari set kumpulan. Teknik ini menyederhanakan kode yang mem-parsing set hasil. Aplikasi Anda tidak harus mengulang baris dan kolom dari set hasil dan mengonversi setiap nilai ke tipe yang sesuai.
Contoh ini bekerja dengan skema dan data sampel berikut:
create table test_simplified_json (a int); insert into test_simplified_json values(17);
public void JSON_deserialization_demo() { var sql = "select * from test_simplified_json"; var request = new ExecuteStatementRequest() .withDatabase(
databaseName
) .withSecretArn(secretStoreArn
) .withResourceArn(clusterArn
) .withSql(sql) .withFormatRecordsAs(RecordsFormatType.JSON); var result = rdsdataClient.executeStatement(request) .getFormattedRecords(); /* Turn the result set into a Java object, a list of records. Each record has a field 'a' corresponding to the column labelled 'a' in the result set. */ private static class Record { public int a; } var recordsList = new ObjectMapper().readValue( response, new TypeReference<List<Record>>() { }); }
Nilai bidang formattedRecords
dari program sebelumnya adalah:
[{"a":17}]
Untuk mengambil kolom a
baris hasil 0, aplikasi akan merujuk ke recordsList.get(0).a
.
Sebaliknya, contoh Java berikut menunjukkan tipe kode yang diperlukan untuk membangun struktur data yang mempertahankan set hasil ketika Anda tidak menggunakan format JSON. Dalam kasus ini, setiap baris dari set hasil berisi bidang dengan informasi tentang satu pengguna. Membangun struktur data untuk merepresentasikan set hasil membutuhkan perulangan melalui baris. Untuk setiap baris, kode mengambil nilai setiap bidang, melakukan konversi tipe yang sesuai, dan menetapkan hasilnya ke bidang yang sesuai dalam objek yang mewakili baris. Kemudian, kode menambahkan objek yang merepresentasikan setiap pengguna ke struktur data yang mewakili seluruh set hasil. Jika kueri diubah untuk menyusun ulang, menambah, atau menghapus bidang dalam set hasil, kode aplikasi juga harus diubah.
/* Verbose result-parsing code that doesn't use the JSON result set format */ for (var row: response.getRecords()) { var user = User.builder() .userId(row.get(0).getLongValue()) .firstName(row.get(1).getStringValue()) .lastName(row.get(2).getStringValue()) .dob(Instant.parse(row.get(3).getStringValue())) .build(); result.add(user); }
Nilai sampel berikut menunjukkan nilai bidang formattedRecords
untuk set hasil dengan jumlah kolom, alias kolom, dan tipe data kolom yang berbeda.
Jika set hasil mencakup beberapa baris, setiap barisnya direpresentasikan sebagai objek yang merupakan elemen array. Setiap kolom dalam set hasil menjadi kunci dalam objek. Nama kolom ini diulang untuk setiap baris dalam set hasil. Oleh karena itu, untuk set hasil yang terdiri dari banyak baris dan kolom, Anda mungkin perlu menentukan alias kolom pendek agar tidak melebihi batas panjang untuk seluruh respons.
Contoh ini bekerja dengan skema dan data sampel berikut:
create table sample_names (id int, name varchar(128)); insert into sample_names values (0, "Jane"), (1, "Mohan"), (2, "Maria"), (3, "Bruce"), (4, "Jasmine");
[{"id":0,"name":"Jane"},{"id":1,"name":"Mohan"}, {"id":2,"name":"Maria"},{"id":3,"name":"Bruce"},{"id":4,"name":"Jasmine"}]
Jika kolom dalam set hasil didefinisikan sebagai ekspresi, teks ekspresi menjadi kunci JSON. Oleh karena itu, praktik mudah umumnya adalah menentukan alias kolom deskriptif untuk setiap ekspresi dalam daftar pilih kueri. Misalnya, kueri berikut mencakup ekspresi seperti panggilan fungsi dan operasi aritmatika dalam daftar pilihannya.
select count(*), max(id), 4+7 from sample_names;
Ekspresi tersebut diteruskan ke set hasil JSON sebagai kunci.
[{"count(*)":5,"max(id)":4,"4+7":11}]
Menambahkan kolom AS
dengan label deskriptif membuat kunci lebih sederhana untuk ditafsirkan dalam set hasil JSON.
select count(*) as rows, max(id) as largest_id, 4+7 as addition_result from sample_names;
Dengan kueri SQL yang direvisi, label kolom yang ditentukan oleh klausa AS
digunakan sebagai nama kunci.
[{"rows":5,"largest_id":4,"addition_result":11}]
Nilai untuk setiap pasangan kunci-nilai dalam string JSON dapat berupa string berkutip. String dapat berisi karakter unicode. Jika string berisi urutan escape maupun karakter "
atau \
, karakter tersebut didahului oleh karakter escape backslash. Contoh string JSON berikut menunjukkan kemungkinan ini. Misalnya, hasil string_with_escape_sequences
berisi karakter khusus backspace, newline, carriage return, tab, form feed, dan \
.
[{"quoted_string":"hello"}] [{"unicode_string":"邓不利多"}] [{"string_with_escape_sequences":"\b \n \r \t \f \\ '"}]
Nilai untuk setiap pasangan kunci-nilai dalam string JSON juga dapat merepresentasikan angka. Angka tersebut dapat berupa bilangan bulat, nilai floating-point, nilai negatif, atau nilai yang direpresentasikan sebagai notasi eksponensial. Contoh string JSON berikut menunjukkan kemungkinan ini.
[{"integer_value":17}] [{"float_value":10.0}] [{"negative_value":-9223372036854775808,"positive_value":9223372036854775807}] [{"very_small_floating_point_value":4.9E-324,"very_large_floating_point_value":1.7976931348623157E308}]
Nilai Boolean dan null direpresentasikan dengan kata kunci khusus tanpa kutip true
, false
, dan null
. Contoh string JSON berikut menunjukkan kemungkinan ini.
[{"boolean_value_1":true,"boolean_value_2":false}] [{"unknown_value":null}]
Jika Anda memilih nilai tipe BLOB, hasilnya direpresentasikan dalam string JSON sebagai nilai berenkode base64. Untuk mengonversi kembali nilai ke representasi aslinya, Anda dapat menggunakan fungsi dekode yang sesuai dalam bahasa aplikasi Anda. Misalnya, Anda memanggil fungsi Base64.getDecoder().decode()
di Java. Output sampel berikut menunjukkan hasil pemilihan nilai BLOB hello world
dan menampilkan set hasil sebagai string JSON.
[{"blob_column":"aGVsbG8gd29ybGQ="}]
Contoh Python berikut menunjukkan cara mengakses nilai-nilai dari hasil panggilan ke fungsi execute_statement
Python. Set hasil adalah nilai string di bidang response['formattedRecords']
. Kode ini mengubah string JSON menjadi struktur data dengan memanggil fungsi json.loads
. Kemudian, setiap baris dari set hasil adalah elemen daftar dalam struktur data, dan Anda dapat merujuk ke setiap bidang set hasil berdasarkan nama dalam setiap baris.
import json result = json.loads(response['formattedRecords']) print (result[0]["id"])
JavaScript Contoh berikut menunjukkan cara mengakses nilai-nilai dari hasil panggilan ke JavaScript executeStatement
fungsi. Set hasil adalah nilai string di bidang response.formattedRecords
. Kode ini mengubah string JSON menjadi struktur data dengan memanggil fungsi JSON.parse
. Kemudian, setiap baris dari set hasil adalah elemen array dalam struktur data, dan Anda dapat merujuk ke setiap bidang set hasil berdasarkan nama dalam setiap baris.
<script> const result = JSON.parse(response.formattedRecords); document.getElementById("display").innerHTML = result[0].id; </script>