What is the preferred method for returning null values in JSON? Is there a different preference for primitives?
For example, if my object on the server has an Integer called "myCount" with no value, the most correct JSON for that value would be:
{} or
{ "myCount": null } or
{ "myCount": 0 } Same question for Strings - if I have a null string "myString" on the server, is the best JSON:
{} or
{ "myString": null } or
{ "myString": "" } or (lord help me)
{ "myString": "null" } I like the convention for collections to be represented in the JSON as an empty collection http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
An empty Array would be represented:
{ "myArray": [] } EDIT Summary
The 'personal preference' argument seems realistic, but short sighted in that, as a community we will be consuming an ever greater number of disparate services/sources. Conventions for JSON structure would help normalize consumption and reuse of said services. As far as establishing a standard, I would suggest adopting most of the Jackson conventions with a few exceptions:
- Objects are preferred over primitives.
- Empty collections are preferred over null.
- Objects with no value are represented as null.
- Primitives return their value.
If you are returning a JSON object with mostly null values, you may have a candidate for refactoring into multiple services.
{ "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 } The above JSON was generated from the following Java class.
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())); } } Maven dependency:
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>2.3.0</version> </dependency> 
null, consider if your client is better of with the empty string ornull-- a string containing the word "null" is indistinguishable from a valid value, don't do that.NSNullclass which has a singleton instance. A reference to that instance is equivalent to JSON'snull. I would guess that another language could do the same thing. Of course, one would have to check the class of the received object before casting to the presumed class -- be "null aware", as it were.Collections.emptyList()). Doing so avoids null reference bugs that can be a pain otherwise.Nullclass because you would only be able to assign its values to objects of its own type or of typeObject.