Escape String JSON di Java

1. Ikhtisar

Dalam tutorial singkat ini, kami akan menunjukkan beberapa cara untuk keluar dari string JSON di Java.

Kami akan mengikuti tur singkat pustaka pemrosesan JSON yang paling populer dan bagaimana mereka membuat pelolosan menjadi tugas sederhana.

2. Apa yang Bisa Salah?

Mari kita pertimbangkan kasus penggunaan yang sederhana namun umum untuk mengirim pesan yang ditentukan pengguna ke layanan web. Secara naif, kita mungkin mencoba:

String payload = "{\"message\":\"" + message + "\"}"; sendMessage(payload);

Tapi, sungguh, ini bisa menimbulkan banyak masalah.

Yang paling sederhana adalah jika pesan tersebut berisi kutipan:

{ "message" : "My "message" breaks json" }

Lebih buruk lagi adalah pengguna dapat dengan sengaja merusak semantik permintaan . Jika dia mengirim:

Hello", "role" : "admin

Kemudian pesannya menjadi:

{ "message" : "Hello", "role" : "admin" }

Pendekatan paling sederhana adalah mengganti tanda kutip dengan urutan escape yang sesuai:

String payload = "{\"message\":\"" + message.replace("\"", "\\\"") + "\"}";

Namun, pendekatan ini cukup rapuh:

  • Ini perlu dilakukan untuk setiap nilai yang digabungkan , dan kita harus selalu mengingat string mana yang telah kita tinggalkan
  • Selain itu, karena struktur pesan berubah dari waktu ke waktu, ini bisa menjadi masalah pemeliharaan
  • Dan sulit untuk dibaca, membuatnya semakin rentan terhadap kesalahan

Sederhananya, kita perlu menggunakan pendekatan yang lebih umum. Sayangnya, fitur pemrosesan JSON asli masih dalam fase JEP , jadi kami harus mengalihkan pandangan ke berbagai pustaka JSON sumber terbuka.

Untungnya, ada beberapa pustaka pemrosesan JSON. Mari kita lihat tiga yang paling populer.

3. JSON-java Library

Pustaka paling sederhana dan terkecil dalam ulasan kami adalah JSON-java juga dikenal sebagai org.json .

Untuk membuat objek JSON, kami cukup membuat instance JSONObject dan pada dasarnya memperlakukannya seperti Peta :

JSONObject jsonObject = new JSONObject(); jsonObject.put("message", "Hello \"World\""); String payload = jsonObject.toString();

Ini akan mengambil kutipan di sekitar "Dunia" dan menghindarinya:

{ "message" : "Hello \"World\"" }

4. Perpustakaan Jackson

Salah satu pustaka Java yang paling populer dan serbaguna untuk pemrosesan JSON adalah Jackson.

Sekilas, Jackson berperilaku mirip dengan org.json :

Map params = new HashMap(); params.put("message", "Hello \"World\""); String payload = new ObjectMapper().writeValueAsString(params);

Namun, Jackson juga dapat mendukung objek Java serialisasi.

Jadi mari kita tingkatkan contoh kita sedikit dengan membungkus pesan kita di kelas khusus:

class Payload { Payload(String message) { this.message = message; } String message; // getters and setters } 

Kemudian, kita membutuhkan sebuah instance dari ObjectMapper di mana kita dapat mengirimkan sebuah instance dari objek kita:

String payload = new ObjectMapper().writeValueAsString(new Payload("Hello \"World\"")); 

Dalam kedua kasus tersebut, kami mendapatkan hasil yang sama seperti sebelumnya:

{ "message" : "Hello \"World\"" }

Dalam kasus di mana kita memiliki properti yang sudah lolos dan perlu membuat serial tanpa pelolosan lebih lanjut, kita mungkin ingin menggunakan anotasi @JsonRawValue Jackson di bidang itu.

5. Perpustakaan Jambu Biji

Gson adalah perpustakaan dari Google yang sering berhadapan langsung dengan Jackson.

Kita bisa, tentu saja, melakukan seperti yang kita lakukan dengan org.json lagi:

JsonObject json = new JsonObject(); json.addProperty("message", "Hello \"World\""); String payload = new Gson().toJson(gsonObject);

Atau kita bisa menggunakan objek khusus, seperti dengan Jackson:

String payload = new Gson().toJson(new Payload("Hello \"World\""));

Dan kita akan mendapatkan hasil yang sama lagi.

6. Kesimpulan

Dalam artikel singkat ini, kami telah melihat cara keluar dari string JSON di Java menggunakan pustaka sumber terbuka yang berbeda.

Semua kode yang terkait dengan artikel ini dapat ditemukan di Github.