JSON에 null 값이 포함되어야 함 [닫힘]


89

결과를 JSON으로 반환하는 API를 만들고 있습니다. 값이 null 일 때 결과에 ​​키를 포함해야하는지 여부에 대한 현재 모범 사례가 있습니까? 예를 들면 :

{
    "title":"Foo Bar",
    "author":"Joe Blow",
    "isbn":null
}

또는

{
    "title":"Foo Bar",
    "author":"Joe Blow"
}

두 번째가 더 작기 때문에이 스타일로 기울고 있지만 선호하는 스타일이 있는지 여부는 확실하지 않습니다. 클라이언트의 관점에서 보면 두 스타일이 기능적으로 동일한 것 같습니다. 각각의 장단점은 무엇입니까?


6
이것에 대해 정확하게 대답하는 것은 불가능합니다. 정답은 응용 프로그램의 요구 사항에 따라 다릅니다. OP는 단순히 자신의 요구 사항에 맞는 답을 선택했습니다. 응용 프로그램이 "isbn"이 null인지 여부와 "isbn"이 다른 이유로 서버에서 전송되지 않았는지 여부를 구분할 수 있어야하는 경우이를 포함해야합니다.
Jay

@Jacob 내가 말하지는 않았지만이 질문에 대한 나의 의도는 응답을 나타내는 "전체"JSON이 반환되는 것입니다. 클라이언트가 두 접근 방식간에 기능적 차이가 없다고 생각할 수있는 경우. API가 키 / 값을 선택적으로 반환하지 않으면 예, 어떤 접근 방식을 취했는지 큰 차이를 만들 것입니다.
jjathman

첫 번째 표현의 이점은 객체 스키마가 보존되고 속성의 존재가 데이터에 따라 모호하지 않다는 것입니다. 두 번째 형식에서는이 정보가 손실됩니다. 따라서 JSON 사양은 AFAIK 형식을 요구하지 않습니다.
Surya Pratap 2016

답변:


32

두 번째 방법은 대역폭을 약간 절약 할 수 있지만 문제가되는 경우 JSON을 키로 채우는 대신 인덱스 배열을 사용할 수도 있습니다. 분명히 ["Foo Bar","Joe Blow"]지금 가지고있는 것보다 훨씬 짧습니다.

사용성 측면에서는 아무런 차이가 없다고 생각합니다. 두 경우 모두 if(json.isbn)else. 일반적으로 null(값 없음)과 undefined(주어진 값 없음 ) 을 구분할 필요가 없습니다.


7
+1 for 일반적으로 null (값 없음)과 정의되지 않음 (주어진 값 없음)을 구분할 필요가 없습니다. 그것을 위해 편리한 연산자도있다 != null(비 엄격한 의도)
Esailija

내가 생각할 수있는 유일한 경우는 브라우저가 특정 이벤트 유형을 지원하는지 테스트하는 것입니다. 예를 들어이 지원 if( typeof onbeforepaste == "undefined")되는지 확인합니다 onBeforePaste. 그래도 원하는 모든 이벤트를 할당 할 수 있으므로 실제적인 차이는 없습니다 (지원되지 않는 경우 아무 작업도 수행하지 않음).
Niet the Dark Absol 2012-06-12

6
전송 된 바이트를 저장하는 측면에서 압축은 인덱스 배열과 같은 것보다 훨씬 더 중요합니다. web-resource-optimization.blogspot.no/2011/06/… 이것이 가장 먼저하는 일인지 확인하십시오. 대부분의 경우 색인 배열과 같은 것을 추가하는 것이 조기 최적화라고 부르는 것입니다. 많은 양의 데이터를 보내지 않는 한. 또한 추가 구문 분석이 필요하므로 앱이 더 복잡해집니다. Gzipping은 브라우저에서 원활하게 수행됩니다. (클라이언트를 가정하는 것은 브라우저입니다)
마틴 한센

3
HTTPS가 하루의 표준이됨에 따라 (적어도 사용자 기반이 큰 앱의 경우) 압축이 엉망이됩니다. 참조 en.wikipedia.org/wiki/CRIME_%28security_exploit%29
Gaurav Vaish

6
내가 평판이 있다면 "보통 null을 구별 할 필요가 없다"에 대해 실제로 -1입니다. 2 가지 이유에서 : 1. 존재하는 것과 희귀하지 않은 것을 구별하는 이유 2. 항상 모호함을 방지하는 "잘 정의 된"값을 갖는 것이 가장 좋습니다.-1 개의 값에 대한 2 개의 의미는 항상 악합니다. 매우 명확해야합니다.
Srneczek

80

나는 의미를 전달하므로 항상 null을 명시 적으로 포함하는 팬입니다. 속성을 생략하면 모호함이 남습니다.

서버와의 프로토콜이 위의 항목 중 하나에 동의하는 한 작동 할 수 있지만 서버에서 null을 전달하면 나중에 API를 더 유연하게 만들 수 있다고 생각합니다.

또한 자바 스크립트의 hasOwnProperty 함수가 더 많은 통찰력을 제공한다는 사실을 언급해야합니다.

/* if true object DOES contain the property with *some* value */
if( objectFromJSON.hasOwnProperty( "propertyName" ) )

/* if true object DOES contain the property and it has been set to null */
if( jsonObject.propertyName === null )

/* if true object either DOES NOT contain the property
   OR
   object DOES contain the property and it has been set to undefined */
if( jsonObject.propertyName === undefined )

3
정확히 더 많은 사람들이 "", null 및 undefined의 차이점을 이해해야합니다. 이 질문에 대한 대답은 사용자 요구 사항에 따라 다릅니다.
Jay

13
+1. 다른 쪽 끝에있는 사람 (코드를 작성한 사람)은 명시적인 값에 의해 더 잘 제공 될 것입니다. 그들은 JavaScript를 작성하지 않을 수 있습니다 ;-)
Steve11235

2
null에 대한 검사는 ==에서 작동하지 않으며 ===가 필요합니다 (undefined == null이기 때문에)!
Tommy

받아 들여진 답변의 첫 부분이 잘못되었습니다 ...
Srneczek

내가 쓰는 것 "propertyName" in objectFromJSON대신에 objectFromJSON.hasOwnProperty("propertyName"). 또한 사용 hasOwnProperty을 고집하면 Object.prototype.hasOwnProperty.call(objectFromJSON, "propertyName")안전을 위해 작성하십시오.
Aadit M Shah

22

자바 스크립트에 null비해 매우 다른 것을 의미한다 undefined.

JSON 출력은 JSON 데이터 사용의 특정 컨텍스트에서 애플리케이션에서 사용하고 필요한 것을 반영해야합니다.


5
- 나는 그가 포함 속성 여부를 "비어"만 여부를 묻는 생각 때문에 더는 JSON에서 "정의되지 않은"없다 {"prop":undefined}다릅니다 {}.
Bergi

동의합니다. 수신 측에서 그가 null로 설정 될 특정 속성을 찾고 있다면 그렇지 않을 것이라고 설명하려고합니다. 생략하면 정의되지 않습니다.
Brad

11

구별 할 필요가있는 경우 당신은 확실히 그것을 포함해야 null하고 undefined그 자바 스크립트에서 두 개의 서로 다른 의미를 갖고 있기 때문에이. null속성이 알려지지 않았거나 의미가 없음 undefined을 의미하고 속성이 존재하지 않는다는 의미 로 생각할 수 있습니다 .

다른 한편으로, 누구든지 그 구별을 할 필요가 없다면 계속해서 그것을 생략하십시오.


0

사용자 경험 뒤에있는 데이터로 JSON을 사용할 때 차이가 없다고 생각합니다.

사용자가 직접 편집해야 할 때 JSON 구성 파일에 차이가 나타납니다. 첫 번째 예제를 사용할 때 사용자에게 구성에 대한 힌트를 제공합니다.


1
제공하는 솔루션에 대한 설명을 추가하여 답변을 더 자세히 설명해 주시겠습니까?
abarisone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.