What is the convention in JSON for empty vs. null?

JavascriptJson

Javascript Problem Overview


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?

Javascript Solutions


Solution 1 - Javascript

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

Solution 2 - Javascript

"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.

Solution 3 - Javascript

There is the question whether we want to differentiate between cases:

  1. "phone" : "" = the value is empty

  2. "phone" : null = the value for "phone" was not set yet

If 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.

Solution 4 - Javascript

Empty array for empty collections and null for everything else.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionrzrelyeaView Question on Stackoverflow
Solution 1 - JavascriptKoen PetersView Answer on Stackoverflow
Solution 2 - Javascriptuser5398447View Answer on Stackoverflow
Solution 3 - JavascriptDaveView Answer on Stackoverflow
Solution 4 - JavascriptNikView Answer on Stackoverflow