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가 실패하는 반면,이 성공할 수 있습니다.

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


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 4627json.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.