Escape JSON String di Java

1. Gambaran keseluruhan

Dalam tutorial ringkas ini, kami akan menunjukkan beberapa cara untuk melepaskan tali JSON di Java.

Kami akan melakukan lawatan singkat ke perpustakaan pemprosesan JSON yang paling popular dan bagaimana mereka menjadikan tugas sebagai pelarian mudah.

2. Apa Yang Salah?

Mari pertimbangkan kes penggunaan yang mudah tetapi biasa untuk menghantar mesej yang ditentukan pengguna ke perkhidmatan web. Naively, kami mungkin mencuba:

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

Tetapi, sebenarnya, ini dapat menimbulkan banyak masalah.

Yang paling mudah adalah jika mesej mengandungi petikan:

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

Lebih buruk lagi ialah pengguna dengan sengaja dapat mematahkan semantik permintaan . Sekiranya dia menghantar:

Hello", "role" : "admin

Kemudian mesej menjadi:

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

Pendekatan paling mudah adalah dengan mengganti petikan dengan urutan pelarian yang sesuai:

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

Walau bagaimanapun, pendekatan ini agak rapuh:

  • Ini perlu dilakukan untuk setiap nilai gabungan , dan kita harus selalu ingat rentetan mana yang telah kita lalui
  • Lebih-lebih lagi, apabila struktur mesej berubah dari masa ke masa, ini boleh menjadi sakit kepala
  • Dan sukar dibaca, menjadikannya lebih rawan ralat

Secara sederhana, kita perlu menggunakan pendekatan yang lebih umum. Malangnya, ciri pemprosesan JSON asli masih dalam fasa JEP , jadi kita harus beralih kepada pelbagai perpustakaan JSON sumber terbuka.

Nasib baik, terdapat beberapa perpustakaan pemprosesan JSON. Mari kita perhatikan tiga yang paling popular.

3. Perpustakaan JSON-java

Perpustakaan termudah dan terkecil dalam ulasan kami adalah JSON-java yang juga dikenali sebagai org.json .

Untuk membina objek JSON, kami hanya membuat contoh JSONObject dan pada dasarnya memperlakukannya seperti Peta :

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

Ini akan mengambil petikan di sekitar "Dunia" dan melepaskannya:

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

4. Perpustakaan Jackson

Salah satu perpustakaan Java yang paling popular dan serba boleh untuk pemprosesan JSON adalah Jackson.

Pada pandangan pertama, Jackson berkelakuan serupa dengan org.json :

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

Walau bagaimanapun, Jackson juga dapat menyokong serialisasi objek Java.

Oleh itu, mari tingkatkan contoh kami sedikit dengan membungkus mesej kami di kelas khusus:

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

Kemudian, kita memerlukan contoh ObjectMapper yang mana kita dapat menyampaikan contoh objek kita:

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

Dalam kedua kes tersebut, kami mendapat hasil yang sama seperti sebelumnya:

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

Sekiranya kita mempunyai harta yang sudah melarikan diri dan perlu membuat siri itu tanpa melarikan diri lebih jauh, kita mungkin ingin menggunakan anotasi Jackson @JsonRawValue di medan tersebut.

5. Perpustakaan Jambu Batu

Gson adalah pustaka dari Google yang sering berhadapan dengan Jackson.

Sudah tentu kita dapat melakukan seperti yang kita lakukan dengan org.json sekali lagi:

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

Atau kita boleh menggunakan objek tersuai, seperti dengan Jackson:

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

Dan kita sekali lagi akan mendapat hasil yang sama.

6. Kesimpulannya

Dalam artikel pendek ini, kita telah melihat bagaimana untuk melepaskan rentetan JSON di Java menggunakan perpustakaan sumber terbuka yang berbeza.

Semua kod yang berkaitan dengan artikel ini boleh didapati di Github.