JSON에서 null을 나타내는


422

JSON에서 null 값을 반환하는 데 선호되는 방법은 무엇입니까? 프리미티브에 대해 다른 환경 설정이 있습니까?

예를 들어, 서버의 오브젝트에 값이없는 "myCount"라는 정수가있는 경우 해당 값에 대한 가장 올바른 JSON은 다음과 같습니다.

{}

또는

{
    "myCount": null
}

또는

{
    "myCount": 0
}

문자열에 대한 동일한 질문-서버에 null 문자열 "myString"이 있으면 최상의 JSON입니다.

{}

또는

{
    "myString": null
}

또는

{
    "myString": ""
}

또는 (주님 도와주세요)

{
    "myString": "null"
}

JSON에서 컬렉션이 빈 컬렉션으로 표시되는 규칙을 좋아합니다. http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html

빈 배열은 다음과 같습니다.

{
    "myArray": []
}

편집 요약

'개인 취향'논증은 현실적으로 보이지만, 공동체로서 우리는 훨씬 더 많은 이질적인 서비스 / 소스를 소비 할 것이라는 점에서 눈에 띄지 않습니다. JSON 구조에 대한 규칙은 해당 서비스의 소비 및 재사용을 정상화하는 데 도움이됩니다. 표준을 설정하는 한 몇 가지 예외를 제외하고 대부분의 Jackson 규칙을 채택하는 것이 좋습니다.

  • 프리미티브보다 객체가 선호됩니다.
  • 빈 컬렉션은 null보다 선호됩니다.
  • 값이없는 객체는 null로 표시됩니다.
  • 프리미티브는 그 가치를 돌려줍니다.

주로 null 값을 가진 JSON 객체를 반환하는 경우 여러 서비스로 리팩토링 할 수 있습니다.

{

    "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

}

위의 JSON은 다음 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()));
    }
}

메이븐 의존성 :

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

5
가장 좋은 방법은 없습니다. 구체적인 사용 사례에서 고객에게 가장 쉬운 것을 선택하십시오. 대신 빈 컬렉션을 반환한다는 개념에서 null클라이언트가 빈 문자열을 사용하는 것이 더 나은지 또는 null"null"이라는 단어가 포함 된 문자열을 유효한 값과 구별 할 수 없는지 고려하십시오.
— Philipp Reichart

3
0 또는 빈 문자열은 null과 다른 의미를 가질 수 있으며 이는 존재하지 않는 속성과 다른 의미를 가질 수 있습니다. 널을 나타내려면 널을 사용하십시오. 가장 명백합니다.
— John Sheehan

Objective-C에는 NSNull싱글 톤 인스턴스 가있는 정의 된 클래스가 있습니다. 해당 인스턴스에 대한 참조는 JSON과 동일합니다 null. 다른 언어도 같은 일을 할 수있을 것 같아요. 물론, 추정 된 클래스로 캐스트하기 전에 수신 된 객체의 클래스를 확인해야합니다. "널 인식"상태입니다.
— 핫 릭

2
"널 (null)"목록을 갖는 것도 Java에서 가장 좋은 방법은 아닙니다. 목록이 비어있을 것으로 예상되면 빈 목록으로 초기화하십시오. 해야하는 경우 남아있는 이 초기화에 (이 새 목록으로 도매 교체가 아닌 값을 추가하도록 수정되기 때문에 예를) 빈 빈리스트 (예 ). 그렇게하면 null 참조 버그를 피할 수 있습니다. 그렇지 않으면 고통을 줄 수 있습니다. Collections.emptyList()
— Periata Breatta

@HotLicks-Objective-C가 동적으로 입력되기 때문에 가능합니다. 예를 들어 Java에서는 Null자체 유형 또는 유형의 객체에만 값을 할당 할 수 있기 때문에 (유용한) 클래스를 가질 수 없습니다 Object.
— Periata Breatta

답변:


378

각각의 파싱을 평가 해 봅시다 :

http://jsfiddle.net/brandonscript/Y2dGv/

var json1 = '{}';
var json2 = '{"myCount": null}';
var json3 = '{"myCount": 0}';
var json4 = '{"myString": ""}';
var json5 = '{"myString": "null"}';
var json6 = '{"myArray": []}';

console.log(JSON.parse(json1)); // {}
console.log(JSON.parse(json2)); // {myCount: null}
console.log(JSON.parse(json3)); // {myCount: 0}
console.log(JSON.parse(json4)); // {myString: ""}
console.log(JSON.parse(json5)); // {myString: "null"}
console.log(JSON.parse(json6)); // {myArray: []}

여기에 tl; dr :

json2 변수 의 조각 은 JSON 사양이 나타내는 방식 null입니다. 그러나 항상 그렇듯이 그것은 당신이하고있는 일에 달려 있습니다. 때로는 "올바른"방법이 항상 상황에 맞는 것은 아닙니다. 판단을 내리고 정보에 근거한 결정을 내립니다.


JSON1 {}

빈 객체를 반환합니다. 거기에 데이터가 없으며 찾고있는 키 ( myCount또는 다른 키)가 유형 이라는 것을 알려줍니다 undefined.


JSON2 {"myCount": null}

이 경우 myCount값은이지만 실제로 정의됩니다 null. 입니다 하지 "둘 다 동일 undefined하지 null", 당신은 하나 개의 조건 또는 기타를 테스트 한 경우 JSON1가 실패하는 반면,이 성공할 수 있습니다.

이 표현하는 확실한 방법입니다 null당 json으로 사양 .


JSON3 {"myCount": 0}

이 경우 myCount는 0입니다. 이는 같지 않으며 같지 null않습니다 false. 만약 당신의 조건문 myCount > 0이 평가 된다면, 이것은 가치가있을 것입니다. 또한 여기서 값을 기준으로 계산을 실행하는 경우 0이 유용 할 수 있습니다. null그러나 테스트하려고하면 실제로 작동하지 않습니다.


JSON4 {"myString": ""}

이 경우 빈 문자열이 나타납니다. 다시 JSON2와 마찬가지로 정의되었지만 비어 있습니다. 당신은 테스트 할 수 if (obj.myString == "")있지만 테스트 할 수 없습니다 null또는 undefined.


JSON5 {"myString": "null"}

문자열 값을 null로 설정하기 때문에 문제가 발생할 수 있습니다 . 이 경우에는, obj.myString == "null"그러나 그것은이다 없습니다 == null .


JSON6 {"myArray": []}

배열 myArray이 존재하지만 비어 있음을 알려줍니다 . 에 대한 카운트 또는 평가를 수행하려는 경우에 유용합니다 myArray. 당신이 할 수있는 - 예를 들어, 사용자가 게시 된 사진의 수를 알아보고자 말 myArray.length과는 반환 0정의하지만, 사진이 게시되지 :.


1
대단히 감사합니다. 작은 쪽 노드; 재생 JSON (스칼라) 옵션을 직렬화 할 때 [문자열] = 없음 결과는 JSON1즉{}
— 닐

207

null0이 아닙니다. 값 자체 는 아닙니다 . 데이터가 없거나 알 수 없음을 나타내는 변수 영역 외부의 값입니다.

nullJSON 에는 표현할 수 있는 유일한 방법이 있습니다 . 사양에 따라 ( RFC 4627 및 json.org ) :

2.1. 가치

JSON 값은 객체, 배열, 숫자 또는 문자열이거나 다음 중 하나 여야합니다.
다음 세 가지 리터럴 이름 :

  거짓 null 참

여기에 이미지 설명을 입력하십시오


8
널 (null)이 없어야한다는 것은 부끄러운 일입니다. 아무 것도없는 4 자. 단순히 값을 완전히 배제하는 것이 좋을 것입니다. json = '{"myValue":}';
— Richard A Quadling

119
@Richard A Quadling-저는 Hal Abelson의 "사람들이 읽을 수 있도록 프로그램을 작성해야하며, 우연히 기계가 실행되도록 프로그램을 작성해야합니다". 우연히 빠지는 문제가 아니라 프로그래머의 의도를 확인하는 '널'이라는 단어를 선호합니다.
— Scott Smith

13
@Dave May : "JSON 값은 프로그램이 아닙니다"-제 요점은 분명한 방식으로 의도를 알리는 것입니다. 예, 추가로 4 자이며, 일부 응용 프로그램의 경우 차이가 클 수 있습니다. 그러나 많은 경우 오류 를 잘못 표시 하는 이점은 사소한 최적화의 이점보다 훨씬 큽니다.
— Scott Smith

11
@Dave 또한 json.org에 따르면 JSON은 "사람들이 읽고 쓰기가 쉽다"고 말했다.
— Sophivorus

14
또한 4 개의 ASCII 문자에 문제가있는 경우 JSON이 최선의 방법은 아니며 바이너리 JSON 이상을 순수한 바이너리 형식으로 보는 것이 좋습니다.
— PhoneixS

26

표현하는 방법은 하나뿐입니다 null. 그것으로입니다 null.

console.log(null === null);   // true
console.log(null === true);   // false
console.log(null === false);  // false
console.log(null === 'null'); // false
console.log(null === "null"); // false
console.log(null === "");     // false
console.log(null === []);     // false
console.log(null === 0);      // false

즉 말하자면; JSON 표현을 사용하는 클라이언트가 ===연산자를 사용하는 경우 그들에게는 문제가 될 수 있습니다.

가치가 없다

속성 myCount에 값이없는 객체가 있음을 전달하려면 다음을 수행하십시오.

{ "myCount": null }

속성이 없거나 누락 된 속성

속성이없는 객체가 있다는 것을 전달한다면 어떻게 될까요?

{}

클라이언트 코드 액세스하려고합니다 myCount얻을 undefined; 없습니다.

빈 컬렉션

myCount빈 목록 인 속성 을 가진 객체가 있다고 전달하는 경우 :

{ "myCount": [] }

+1 좋은 예제와 비교하지만 javascript와 json을 구별하는 것이 도움이됩니다. 즉, javascript에서 null 표현은 json과 일치하지 않아도됩니다 (그렇지만).
— Mladen B.

15

null특정 키에 대한 값이 없음을 보여주기 위해 사용 합니다. 예를 들어, null"가정에있는 장치 수가 인터넷에 연결되어 있음"을 나타내는 데 사용 하십시오.

반면 {}특정 키가 적용되지 않는 경우 사용 하십시오. 예를 들어, null자동차를 소유하지 않은 사람에게 "인터넷 연결이 활성화 된 자동차 수"라는 질문에 대한 개수를 표시해서는 안됩니다 .

그 기본값이 의미가 없으면 값을 기본값으로 설정하지 마십시오. null값을 나타내지 않기 위해 사용 하기로 결정할 수도 있지만 반드시 "null"그렇게하지는 마십시오.


7

변수의 데이터 유형 ( null문자열 / 객체, 0숫자)에 대해 "default"를 선택 하지만 실제로 객체를 소비 할 코드는 무엇인지 확인하십시오. null/ default와 "not present" 사이에 차이가 있다는 것을 잊지 마십시오 .

null 객체 패턴을 확인하십시오 -때로는 특수 객체를 대신 전달하는 것이 좋습니다 null(예 : []배열 null또는 ""문자열 대신 배열 ).


2

이것은 개인적이고 상황에 맞는 선택입니다. 기억해야 할 중요한 것은 빈 문자열과 숫자 0은 개념적으로 구별된다는 것입니다 null.

의 경우 count항상 유효한 숫자를 원할 것입니다 ( count알 수 없거나 정의되지 않은 경우 제외). 문자열의 경우 누가 알 수 있습니까? 빈 문자열은 애플리케이션에서 무언가를 의미 할 수 있습니다. 아니면 아닐 수도 있습니다. 결정하는 것은 당신에게 달려 있습니다.


1

JSON 사양 에 따르면 , 가장 바깥 쪽 컨테이너는 위의 주석 대부분에 암시 된 사전 (또는 '개체') 일 필요는 없습니다. 또한 목록 또는 기본 값 (예 : 문자열, 숫자, 부울 또는 널) 일 수 있습니다. JSON에서 null 값을 나타내려면 전체 JSON 문자열 (JSON 문자열을 포함하는 따옴표 제외)은 간단 null합니다. 괄호, 괄호, 따옴표가 없습니다. 널값 ( {"key1":null}) 이있는 키 또는 널값 ( )이있는 목록을 포함하는 사전을 지정할 수 [null]있지만 이들은 널값 자체가 아니며 올바른 사전 및 목록입니다. 마찬가지로 빈 사전 ( {}) 또는 빈 목록 ( [])은 완벽하지만 아무 것도 아닙니다.

파이썬에서 :

>>> print json.loads('{"key1":null}')
{u'key1': None}
>>> print json.loads('[null]')
[None]
>>> print json.loads('[]')
[]
>>> print json.loads('{}')
{}
>>> print json.loads('null')
None

연결된 JSON 사양 페이지의 오른쪽 사이드 바에있는 McKeeman Form 문법은 null유효한 JSON을 구성 하는 어설 션의 유효성을 검사합니다 . 본문과 그림은 모호하며 어떤 것이라도 객체와 배열 만 루트에서 유효하다고 제안하는 것 같습니다.
— yoyoyoyosef
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.