Reprezentowanie wartości null w JSON

Jaka jest preferowana metoda zwracania wartości pustych w JSON? Czy jest inna preferencja dla prymitywów?

Na przykład, jeśli mój obiekt na serwerze ma liczbę całkowitą o nazwie „myCount” bez wartości, najbardziej poprawnym JSON dla tej wartości będzie:

{}

lub

{
    "myCount": null
}

lub

{
    "myCount": 0
}

To samo pytanie dla ciągów znaków - jeśli mam na serwerze łańcuch pusty „myString”, to jest to najlepszy JSON:

{}

lub

{
    "myString": null
}

lub

{
    "myStrung": ""
}

lub (panie pomóż mi)

{
    "myString": "null"
}

Podoba mi się, że konwencja dotycząca kolekcji jest reprezentowana w JSON jako pusta kolekcjahttp://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

Reprezentowana byłaby pusta tablica:

{
    "myArray": []
}

EDIT Podsumowanie

Argument „preferencji osobistych” wydaje się realistyczny, ale krótki w tym, ponieważ społeczność będzie konsumowała większą liczbę różnych usług / źródeł. Konwencje dotyczące struktury JSON pomogłyby znormalizować zużycie i ponowne wykorzystanie wspomnianych usług. Jeśli chodzi o ustanowienie standardu, sugerowałbym przyjęcie większości konwencji Jacksona z kilkoma wyjątkami:

Obiekty są preferowane w stosunku do prymitywów.Puste kolekcje są preferowane powyżej wartości null.Obiekty bez wartości są reprezentowane jako null.Prymitywy zwracają swoją wartość.

Jeśli zwracasz obiekt JSON z przeważnie wartościami null, możesz mieć kandydata do refaktoryzacji na wiele usług.

{

    "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

}

Powyższy JSON został wygenerowany z następującej klasy 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()));
    }
}

Zależność Mavena:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-core</artifactId>
    <version>2.3.0</version>
</dependency>

questionAnswers(7)

yourAnswerToTheQuestion