Apa metode yang disukai untuk mengembalikan nilai nol di JSON? Apakah ada preferensi yang berbeda untuk primitif?
Misalnya, jika objek saya di server memiliki Integer yang disebut "myCount" tanpa nilai, JSON paling benar untuk nilai itu adalah:
{}
atau
{
"myCount": null
}
atau
{
"myCount": 0
}
Pertanyaan yang sama untuk Strings - jika saya memiliki string nol "myString" di server, adalah JSON terbaik:
{}
atau
{
"myString": null
}
atau
{
"myString": ""
}
atau (tuan bantu aku)
{
"myString": "null"
}
Saya suka konvensi untuk koleksi diwakili di JSON sebagai koleksi kosong http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Array kosong akan ditampilkan:
{
"myArray": []
}
Ringkasan EDIT
Argumen 'preferensi pribadi' tampak realistis, tetapi kelihatannya tidak terlalu jelas, sebagai sebuah komunitas, kita akan mengkonsumsi lebih banyak layanan / sumber yang berbeda. Konvensi untuk struktur JSON akan membantu menormalkan konsumsi dan penggunaan kembali layanan tersebut. Sejauh menetapkan standar, saya akan menyarankan mengadopsi sebagian besar konvensi Jackson dengan beberapa pengecualian:
- Objek lebih disukai daripada primitif.
- Koleksi kosong lebih disukai daripada nol.
- Objek tanpa nilai direpresentasikan sebagai null.
- Primitif mengembalikan nilainya.
Jika Anda mengembalikan objek JSON dengan nilai sebagian besar nol, Anda mungkin memiliki kandidat untuk melakukan refactoring ke beberapa layanan.
{
"value1": null,
"value2": null,
"text1": null,
"text2": "hello",
"intValue": 0, //use primitive only if you are absolutely sure the answer is 0
"myList": [],
"myEmptyList": null, //NOT BEST PRACTICE - return [] instead
"boolean1": null, //use primitive only if you are absolutely sure the answer is true/false
"littleboolean": false
}
JSON di atas dihasilkan dari kelas Java berikut.
package jackson;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.ObjectMapper;
public class JacksonApp {
public static class Data {
public Integer value1;
public Integer value2;
public String text1;
public String text2 = "hello";
public int intValue;
public List<Object> myList = new ArrayList<Object>();
public List<Object> myEmptyList;
public Boolean boolean1;
public boolean littleboolean;
}
public static void main(String[] args) throws Exception {
ObjectMapper mapper = new ObjectMapper();
System.out.println(mapper.writeValueAsString(new Data()));
}
}
Ketergantungan maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
null
, pertimbangkan apakah klien Anda lebih baik menggunakan string kosong ataunull
- string yang berisi kata "null" tidak dapat dibedakan dari nilai yang valid, jangan lakukan itu.NSNull
kelas yang didefinisikan yang memiliki instance tunggal. Referensi ke instance itu setara dengan JSONnull
. Saya kira bahasa lain bisa melakukan hal yang sama. Tentu saja, seseorang harus memeriksa kelas objek yang diterima sebelum melakukan casting ke kelas yang diduga - menjadi "null aware", seolah-olah.Collections.emptyList()
). Melakukan hal itu menghindari bug referensi nol yang dapat menyusahkan jika tidak.Null
karena Anda hanya akan dapat menetapkan nilainya ke objek dari tipe atau tipe sendiriObject
.Jawaban:
Mari kita evaluasi parsing masing-masing:
http://jsfiddle.net/brandonscript/Y2dGv/
JSON1
{}
Ini mengembalikan objek kosong. Tidak ada data di sana, dan itu hanya akan memberi tahu Anda bahwa kunci apa pun yang Anda cari (baik itu
myCount
atau sesuatu yang lain) adalah tipeundefined
.JSON2
{"myCount": null}
Dalam hal ini,
myCount
sebenarnya didefinisikan, meskipun nilainyanull
. Ini tidak sama dengan "tidakundefined
dan tidaknull
", dan jika Anda menguji untuk satu kondisi atau yang lain, ini mungkin berhasil sedangkan JSON1 akan gagal.Ini adalah cara definitif untuk mewakili
null
per spesifikasi JSON .JSON3
{"myCount": 0}
Dalam hal ini, myCount adalah 0. Itu tidak sama dengan
null
, dan itu tidak sama denganfalse
. Jika pernyataan bersyarat Anda mengevaluasimyCount > 0
, maka ini mungkin bermanfaat untuk dimiliki. Selain itu, jika Anda menjalankan perhitungan berdasarkan nilai di sini, 0 bisa berguna. Namun, jika Anda mencoba mengujinull
, ini sebenarnya tidak akan berhasil sama sekali.JSON4
{"myString": ""}
Dalam hal ini, Anda mendapatkan string kosong. Sekali lagi, seperti JSON2, itu didefinisikan, tetapi kosong. Anda dapat menguji
if (obj.myString == "")
tetapi Anda tidak dapat mengujinull
atauundefined
.JSON5
{"myString": "null"}
Ini mungkin akan membuat Anda dalam masalah, karena Anda menetapkan nilai string ke nol; dalam hal ini,
obj.myString == "null"
bagaimanapun tidak== null
.JSON6
{"myArray": []}
Ini akan memberi tahu Anda bahwa array Anda
myArray
ada, tetapi kosong. Ini berguna jika Anda mencoba melakukan penghitungan atau evaluasimyArray
. Misalnya, Anda ingin mengevaluasi jumlah foto yang diposkan pengguna - yang dapat Anda lakukanmyArray.length
dan akan kembali0
: ditentukan, tetapi tidak ada foto yang diposkan.sumber
JSON1
yaitu{}
null
bukan nol. Ini bukan nilai, per se : itu adalah nilai di luar domain variabel yang menunjukkan data yang hilang atau tidak dikenal.Hanya ada satu cara untuk mewakili
null
di JSON. Sesuai spesifikasi ( RFC 4627 dan json.org ):sumber
json = '{"myValue":}';
Hanya ada satu cara untuk mewakili
null
; itu dengannull
.Artinya; jika ada klien yang menggunakan representasi JSON Anda menggunakan
===
operator; itu bisa menjadi masalah bagi mereka.Tidak bernilai
Jika Anda ingin menyampaikan bahwa Anda memiliki objek yang atributnya
myCount
tidak memiliki nilai:tidak ada atribut / atribut yang hilang
Bagaimana jika Anda menyampaikan bahwa Anda memiliki objek tanpa atribut:
Kode klien akan mencoba mengakses
myCount
dan mendapatkanundefined
; itu tidak ada di sana.koleksi kosong
Bagaimana jika Anda menyampaikan bahwa Anda memiliki objek dengan atribut
myCount
yang merupakan daftar kosong:sumber
Saya akan gunakan
null
untuk menunjukkan bahwa tidak ada nilai untuk kunci khusus itu. Misalnya, gunakannull
untuk menyatakan bahwa "jumlah perangkat di rumah Anda terhubung ke internet" tidak diketahui.Di sisi lain, gunakan
{}
jika kunci tertentu itu tidak berlaku. Misalnya, Anda tidak boleh menunjukkan hitungan, bahkan jikanull
, untuk pertanyaan "jumlah mobil yang memiliki koneksi internet aktif" diminta kepada seseorang yang tidak memiliki mobil.Saya akan menghindari default nilai apa pun kecuali default itu masuk akal. Meskipun Anda mungkin memutuskan untuk menggunakan
null
untuk mewakili tidak ada nilai, tentu tidak pernah digunakan"null"
untuk melakukannya.sumber
Saya akan memilih "default" untuk tipe data variabel (
null
untuk string / objek,0
untuk angka), tetapi memang memeriksa kode apa yang akan mengkonsumsi objek yang diharapkan. Jangan lupa ada kadang-kadang ada perbedaan antaranull
/ default vs "not present".Lihat pola objek nol - terkadang lebih baik untuk melewatkan beberapa objek khusus daripada
null
(misalnya[]
array daripadanull
untuk array atau""
untuk string).sumber
Ini adalah pilihan pribadi dan situasional. Yang penting untuk diingat adalah bahwa string kosong dan angka nol secara konseptual berbeda
null
.Dalam kasus a,
count
Anda mungkin selalu menginginkan angka yang valid (kecuali jikacount
tidak diketahui atau tidak terdefinisi), tetapi dalam kasus string, siapa yang tahu? String kosong dapat berarti sesuatu dalam aplikasi Anda. Atau mungkin tidak. Terserah Anda yang memutuskan.sumber
Menurut spesifikasi JSON , wadah terluar tidak harus berupa kamus (atau 'objek') sebagaimana tersirat dalam sebagian besar komentar di atas. Ini juga bisa berupa daftar atau nilai telanjang (yaitu string, angka, boolean atau null). Jika Anda ingin mewakili nilai nol di JSON, seluruh string JSON (tidak termasuk tanda kutip yang berisi string JSON) adalah sederhana
null
. Tanpa kawat gigi, tidak ada kurung, tidak ada tanda kutip. Anda dapat menentukan kamus yang berisi kunci dengan nilai nol ({"key1":null}
), atau daftar dengan nilai nol ([null]
), tetapi ini bukan nilai nol sendiri - kamus dan daftar yang tepat. Demikian pula, kamus kosong ({}
) atau daftar kosong ([]
) baik-baik saja, tetapi juga tidak nol.Dengan Python:
sumber
null
merupakan JSON yang valid. Teks tubuh utama dan ilustrasi di sana tidak jelas dan jika ada yang menyarankan hanya objek dan array yang valid pada root.