Qual è il metodo preferito per restituire valori null in JSON? Esiste una preferenza diversa per i primitivi?
Ad esempio, se il mio oggetto sul server ha un numero intero chiamato "myCount" senza valore, il JSON più corretto per quel valore sarebbe:
{}
o
{
"myCount": null
}
o
{
"myCount": 0
}
Stessa domanda per le stringhe - se ho una stringa null "myString" sul server, è il JSON migliore:
{}
o
{
"myString": null
}
o
{
"myString": ""
}
o (signore aiutami)
{
"myString": "null"
}
Mi piace che la convenzione per le raccolte sia rappresentata nel JSON come raccolta vuota http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html
Un array vuoto sarebbe rappresentato:
{
"myArray": []
}
Riepilogo EDIT
L'argomento delle "preferenze personali" sembra realistico, ma poco lungimirante in quanto, come comunità, consumeremo un numero sempre maggiore di servizi / fonti disparate. Le convenzioni per la struttura JSON aiuterebbero a normalizzare il consumo e il riutilizzo di tali servizi. Per quanto riguarda la definizione di uno standard, suggerirei di adottare la maggior parte delle convenzioni di Jackson con alcune eccezioni:
- Gli oggetti sono preferiti rispetto alle primitive.
- Le raccolte vuote sono preferite rispetto a null.
- Gli oggetti senza valore sono rappresentati come null.
- I primitivi restituiscono il loro valore.
Se si restituisce un oggetto JSON con valori prevalentemente nulli, è possibile che si abbia un candidato per il refactoring in più servizi.
{
"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
}
Il JSON sopra è stato generato dalla seguente classe Java.
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()));
}
}
Dipendenza da Maven:
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.3.0</version>
</dependency>
NSNull
classe definita che ha un'istanza singleton. Un riferimento a tale istanza equivale a JSON null
. Immagino che un'altra lingua possa fare la stessa cosa. Ovviamente, si dovrebbe controllare la classe dell'oggetto ricevuto prima di lanciarla nella classe presunta - essere "nullo", per così dire.
Collections.emptyList()
.). In questo modo si evitano bug di riferimento null che potrebbero essere altrimenti un dolore.
Null
classe (utile) perché potresti assegnare i suoi valori solo a oggetti del suo tipo o tipo Object
.
null
, considera se il tuo client è meglio con la stringa vuota onull
- una stringa contenente la parola "null" è indistinguibile da un valore valido, non farlo.