Saya perlu memasukkan objek JSON ke dalam atribut pada elemen HTML.
HTML tidak harus memvalidasi.Dijawab oleh Quentin: Simpan JSON dalam
data-*
atribut , yang merupakan HTML5 yang valid.Objek JSON bisa berukuran berapa saja - yaitu sangat besar
Dijawab oleh Maiku Mori: Batas untuk atribut HTML kemungkinan adalah 65536 karakter .
Bagaimana jika JSON berisi karakter khusus? misalnya
{foo: '<"bar/>'}
Dijawab oleh Quentin: Encode string JSON sebelum memasukkannya ke dalam atribut, seperti konvensi biasa. Untuk PHP, gunakan fungsi .
htmlentities()
EDIT - Contoh solusi menggunakan PHP dan jQuery
Menulis JSON ke dalam atribut HTML:
<?php
$data = array(
'1' => 'test',
'foo' => '<"bar/>'
);
$json = json_encode($data);
?>
<a href="#" data-json="<?php echo htmlentities($json, ENT_QUOTES, 'UTF-8'); ?>">CLICK ME</a>
Mengambil JSON menggunakan jQuery:
$('a').click(function() {
// Read the contents of the attribute (returns a string)
var data = $(this).data('json');
// Parse the string back into a proper JSON object
var json = $.parseJSON($(this).data('json'));
// Object now available
console.log(json.foo);
});
javascript
php
html
json
BadHorsie
sumber
sumber
data-json
Anda diberi nama, Anda harus menggunakan$(this).data('json')
, jQuery telah Anda bahas di bagian itu.Jawaban:
Kenapa tidak? Validasi QA sangat mudah yang menangkap banyak kesalahan. Gunakan
data-*
atribut HTML 5 .Saya belum melihat dokumentasi apa pun tentang batasan browser untuk ukuran atribut.
Jika Anda menemui mereka, maka simpan data di file
<script>
. Definisikan sebuah objek dan petakan elemenid
ke nama properti di objek itu.Ikuti saja aturan normal untuk memasukkan data tidak tepercaya dalam nilai atribut. Gunakan
&
dan"
(jika Anda membungkus nilai atribut dalam tanda kutip ganda) atau'
(jika Anda membungkus nilai atribut dalam tanda kutip tunggal).Namun, perhatikan bahwa itu bukan JSON (yang mengharuskan nama properti berupa string dan string hanya dipisahkan dengan tanda kutip ganda).
sumber
htmlentities($json)
sebelum memasukkannya ke dalam atribut HTML? Lalu bagaimana cara memecahkan kode itu ketika saya ingin membacanya di jQuery? Lalu bagaimana cara menuliskannya kembali menggunakan jQuery dengan cara yang sama seperti di PHP?Tergantung di mana Anda menaruhnya,
<div>
seperti yang Anda minta, Anda perlu memastikan bahwa JSON tidak mengandung spesial HTML yang bisa memulai tag, komentar HTML, tertanam doctype, dll Anda perlu untuk melarikan diri setidaknya<
, dan&
sedemikian rupa bahwa karakter asli tidak muncul di urutan lolos.<script>
elemen, Anda perlu memastikan bahwa JSON tidak berisi tag akhir</script>
atau keluar dari batas teks:<!--
atau-->
."
atau'
).Untuk dua kasus pertama (dan untuk pengurai JSON lama), Anda harus mengenkode U + 2028 dan U + 2029 karena itu adalah karakter baris baru di JavaScript meskipun diizinkan dalam string yang tidak dikodekan di JSON.
Untuk kebenaran, Anda perlu melarikan diri
\
dan karakter kutipan JSON dan tidak pernah merupakan ide yang buruk untuk selalu menyandikan NUL.Jika HTML mungkin disajikan tanpa pengkodean konten, Anda harus melakukan enkode
+
untuk mencegah serangan UTF-7 .Bagaimanapun, tabel pelolosan berikut akan berfungsi:
\u0000
\n
atau\u000a
\r
atau\u000d
"
->\u0022
&
->\u0026
'
->\u0027
+
->\u002b
/
->\/
atau\u002f
<
->\u003c
>
->\u003e
\
->\\
atau\u005c
\u2028
\u2029
Jadi nilai string JSON untuk teks
Hello, <World>!
dengan baris baru di akhir adalah"Hello, \u003cWorld\u003e!\r\n"
.sumber
return (input.replace(/([\s"'
& + \ / \\ <> \ u2028 \ u2029 \ u0000]) / g, (cocok, p1) => {kembali\\u${p1.codePointAt(0).toString(16).padStart(4, 0)}
; })); `Cara lain Anda dapat melakukannya - adalah meletakkan data json di dalam
<script>
tag, tetapi tidak dengantype="text/javascript"
, tetapi dengantype="text/bootstrap"
atautype="text/json"
ketik, untuk menghindari eksekusi javascript.Kemudian, di beberapa tempat program Anda, Anda dapat memintanya dengan cara ini:
Di sisi server, Anda dapat melakukan sesuatu seperti ini (contoh ini dengan php dan ranting ):
sumber
<script type="application/json" id="MyData"></script>
karya dengan sempurna. Kemudian, menggunakan ActiveWAFL / DblEj, saya bisa melihat itu dengan:document.GetData("#MyData")
.<script type="application/json" id="MyData"> "abc</script><script>alert()</script>" </script>
Pilihan lainnya adalah dengan base64 menyandikan string JSON dan jika Anda perlu menggunakannya dalam javascript, dekode dengan
atob()
fungsi tersebut.sumber
atob
. Saya tidak pernah menyadarinya!Anda bisa menggunakan knockoutjs,
knockout.js
Keluaran
Nama depan: Jayson Nama belakang: Monterroso
Periksa ini: http://learn.knockoutjs.com/
sumber
Tidak ada yang mewah di sini. Dari PHP, jalankan string JSON
htmlspecialchars
untuk memastikan tidak ada karakter khusus yang dapat diinterpretasikan sebagai HTML. Dari Javascript, tidak perlu keluar; cukup setel atributnya dan Anda siap melakukannya.sumber
Untuk objek JSON sederhana, kode di bawah ini akan berfungsi.
Menyandi:
Membaca sandi:
sumber
Apa yang dapat Anda lakukan adalah menggunakan cdata di sekitar elemen Anda seperti ini
dimana mydata adalah string json mentah. Semoga ini bisa membantu Anda dan orang lain.
sumber
">
di mydata?Pemikiran lain yang dapat digunakan adalah menyimpan data JSON sebagai string base64 dalam atribut dan kemudian menggunakan
window.atob
atauwindow.btoa
mengembalikannya ke data JSON yang dapat digunakan.sumber