Saat membuat data JSON secara manual, bagaimana cara saya keluar dari bidang string? Haruskah saya menggunakan sesuatu seperti Apache Commons Lang StringEscapeUtilities.escapeHtml
, StringEscapeUtilities.escapeXml
atau harus saya gunakan java.net.URLEncoder
?
Masalahnya adalah bahwa ketika saya menggunakan SEU.escapeHtml
, itu tidak lepas tanda kutip dan ketika saya membungkus seluruh string dalam sepasang '
s, JSON yang salah bentuk akan dihasilkan.
'
, Anda akan ditakdirkan sejak awal: String JSON hanya dapat dikelilingi dengan"
. Lihat ietf.org/rfc/rfc4627.txt .StringEscapeUtilities
garis besarnya. Ini sangat berguna.Jawaban:
Idealnya, temukan pustaka JSON dalam bahasa Anda yang dapat Anda beri makan beberapa struktur data yang sesuai, dan biarkan khawatir tentang cara melarikan diri . Itu akan membuat Anda lebih waras. Jika karena alasan apa pun Anda tidak memiliki perpustakaan dalam bahasa Anda, Anda tidak ingin menggunakannya (saya tidak menyarankan ini¹), atau Anda sedang menulis perpustakaan JSON, baca terus.
Hindarilah menurut RFC. JSON cukup liberal: Satu-satunya karakter Anda harus melarikan diri adalah
\
,"
, dan kode kontrol (sesuatu yang kurang dari U + 0020).Struktur pelarian ini khusus untuk JSON. Anda membutuhkan fungsi spesifik JSON. Semua lolos dapat ditulis sebagai di
\uXXXX
manaXXXX
unit kode UTF-16¹ untuk karakter itu. Ada beberapa cara pintas, seperti\\
, yang berfungsi juga. (Dan mereka menghasilkan output yang lebih kecil dan lebih jelas.)Untuk detail lengkap, lihat RFC .
Pelarian SONJSON dibangun di atas JS, jadi ia menggunakan
\uXXXX
, di manaXXXX
adalah unit kode UTF-16. Untuk titik kode di luar BMP, ini berarti menyandikan pasangan pengganti, yang bisa menjadi sedikit berbulu. (Atau, Anda bisa menampilkan karakter secara langsung, karena JSON yang dikodekan adalah teks Unicode, dan memungkinkan karakter khusus ini.)sumber
"
).{[]}:?
tidak boleh lolos dengan backslash tunggal. (\:
, misalnya, tidak valid dalam string JSON.) Semua itu secara opsional dapat diloloskan menggunakan\uXXXX
sintaks, dengan membuang beberapa byte. Lihat §2.5 dari RFC.JSON.stringify()
melakukan pekerjaan itu.Ekstrak dari Jettison :
sumber
"
,,\
dan karakter kontrol (yang sebelum "") valid di dalam string JSON selama encoding output cocok. Dengan kata lain, Anda tidak perlu menyandikan "펍"\uD38D
selama pengkodean UTF dipertahankan.Coba ini
org.codehaus.jettison.json.JSONObject.quote("your string")
.Unduh di sini: http://mvnrepository.com/artifact/org.codehaus.jettison/jettison
sumber
org.json.simple.JSONObject.escape () lolos dari tanda kutip, \, /, \ r, \ n, \ b, \ f, \ t dan karakter kontrol lainnya. Itu dapat digunakan untuk menghindari kode JavaScript.
sumber
Apache commons lang sekarang mendukung ini. Pastikan Anda memiliki versi Apache commons yang cukup baru di classpath Anda. Anda membutuhkan versi 3.2+
Catatan Rilis untuk versi 3.2
LANG-797: Menambahkan escape / unescapeJson ke StringEscapeUtils.
sumber
/
karakter. Ini memecah banyak hal termasuk JSON dengan URL di dalamnya. Proposal asli memiliki/
sebagai char khusus untuk melarikan diri tetapi ini tidak lagi terjadi, seperti yang dapat kita lihat dalam spesifikasi terbaru pada saat penulisanorg.json.JSONObject
quote(String data)
Metode melakukan pekerjaanAmbil dari dokumentasi:
sumber
org.apache.sling.commons.json.JSONObject
juga memiliki hal yang samaStringEscapeUtils.escapeJavaScript
SayaStringEscapeUtils.escapeEcmaScript
harus melakukan triknya juga.sumber
escapeJavaScript
lolos dari tanda kutip tunggal sebagai\'
, yang tidak benar.Jika Anda menggunakan fastexml jackson, Anda dapat menggunakan yang berikut ini:
com.fasterxml.jackson.core.io.JsonStringEncoder.getInstance().quoteAsString(input)
Jika Anda menggunakan codehaus jackson, Anda dapat menggunakan yang berikut ini:
org.codehaus.jackson.io.JsonStringEncoder.getInstance().quoteAsString(input)
sumber
Tidak yakin apa yang Anda maksud dengan "membuat json secara manual", tetapi Anda dapat menggunakan sesuatu seperti gson ( http://code.google.com/p/google-gson/ ), dan itu akan mengubah HashMap, Array, String, dll. , ke nilai JSON. Saya sarankan pergi dengan kerangka kerja untuk ini.
sumber
Saya belum menghabiskan waktu untuk memastikan 100%, tetapi itu bekerja untuk masukan saya cukup untuk diterima oleh validator JSON online:
meskipun tidak terlihat lebih baik daripada
org.codehaus.jettison.json.JSONObject.quote("your string")
Saya cukup menggunakan alat kecepatan dalam proyek saya - bangunan "manual JSON" saya berada dalam templat kecepatan
sumber
Bagi mereka yang datang ke sini mencari solusi baris perintah, seperti saya, --Data-urlencode cURL berfungsi dengan baik:
mengirim
, sebagai contoh. Data JSON yang lebih besar dapat dimasukkan ke dalam file dan Anda akan menggunakan sintaks @ untuk menentukan file yang akan disedot dari data yang akan diloloskan. Misalnya, jika
Anda akan menggunakan
Dan sekarang, ini juga merupakan tutorial tentang cara meminta Freebase dari baris perintah :-)
sumber
Gunakan kelas EscapeUtils di commons lang API.
sumber
Pertimbangkan Moshi 's JsonWriter kelas. Ini memiliki API yang luar biasa dan mengurangi penyalinan seminimal mungkin, semuanya dapat dialirkan dengan baik ke arsip, OutputStream, dll.
Jika Anda ingin string di tangan:
sumber
Apache commons-text sekarang memiliki StringEscapeUtils.escapeJson (String) .
sumber
Jika Anda perlu keluar dari JSON di dalam string JSON, gunakan org.json.JSONObject.quote ("string json Anda yang perlu diloloskan") tampaknya berfungsi dengan baik
sumber
menggunakan sintaks \ uXXXX dapat menyelesaikan masalah ini, google UTF-16 dengan nama tanda, Anda dapat mengetahui XXXX, misalnya: utf-16 double quote
sumber
Metode di sini yang menunjukkan implementasi aktual semuanya salah.
Saya tidak memiliki kode Java, tetapi hanya sebagai catatan, Anda dapat dengan mudah mengkonversi kode C # ini:
Atas perkenan mono-proyek @ https://github.com/mono/mono/blob/master/mcs/class/System.Web/System.Web/HttpUtility.cs
Ini bisa dipadatkan
sumber
quote()
metode yang dijelaskan dalam jawaban lain salah?Saya pikir jawaban terbaik di 2017 adalah menggunakan API javax.json. Gunakan javax.json.JsonBuilderFactory untuk membuat objek json Anda, kemudian tulis objek menggunakan javax.json.JsonWriterFactory. Kombinasi pembangun / penulis yang sangat bagus.
sumber