Reputation: 1497
I know that in most programming scenarios, the preference is for empty collections to null collections when there are 0 elements. However, most languages that consume JSON (like JavaScript) will treat empty lists/objects as true and null ones as false. For example this would be both true and an object in JavaScript:
{
"items_in_stock": {"widgets":10, "gadgets": 5}
}
But this is also true:
{
"items_in_stock": {}
}
And this is false:
{
"items_in_stock": null
}
Is there a convention on empty objects/lists for JSON? And what about for numbers, booleans, and strings?
Upvotes: 94
Views: 222428
Reputation: 351
There is the question whether we want to differentiate between cases:
"phone" : null
= the value for "phone" was not set yet"phone" : ""
= the value for "phone" was set and it is emptyIf we want differentiate I would use null
for this. Otherwise we would need to add a new field like "isAssigned" or so. This is an old database issue.
Upvotes: 8
Reputation: 12916
It is good programming practice to return an empty array []
if the expected return type is an array. This makes sure that the receiver of the json can treat the value as an array immediately without having to first check for null. It's the same way with empty objects using open-closed braces {}
.
Strings, Booleans and integers do not have an 'empty' form, so there it is okay to use null values.
This is also addressed in Joshua Blochs excellent book "Effective Java". There he describes some very good generic programming practices (often applicable to other programming langages as well). Returning empty collections instead of nulls is one of them.
Here's a link to that part of his book:
http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Upvotes: 94
Reputation:
"JSON has a special value called null which can be set on any type of data including arrays, objects, number and boolean types."
"The JSON empty concept applies for arrays and objects...Data object does not have a concept of empty lists. Hence, no action is taken on the data object for those properties."
Here is my source.
Upvotes: 12