2012-06-12 5 views
83

결과를 JSON으로 리턴하는 API를 작성하고 있습니다. 값이 null 일 때 결과에 ​​키를 포함해야하는지에 대한 현재 최상의 방법이 있습니까? 예를 들면 :JSON에 null 값이 포함되어야합니까?

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

또는

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

두 번째는 내가이 스타일쪽으로 생각이 기울고 있어요,하지만 거기 선호하는 스타일인지 아닌지 잘 모르겠어요 작기 때문에

. 클라이언트 관점에서 두 스타일이 기능적으로 동일 할 것 같습니다. 각 장단점은 무엇입니까?

+5

정확하게 대답 할 수 없습니다. 정답은 응용 프로그램의 요구 사항에 따라 다릅니다. OP는 자신의 요구 사항에 맞는 대답을 선택했습니다. 응용 프로그램에서 "isbn"이 null인지 또는 다른 이유로 서버에서 "isbn"이 전송되지 않았는지를 구별 할 수 있어야하는 경우이를 포함시켜야합니다. – Jacob

+0

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

+0

첫 번째 표현의 장점은 개체 스키마가 유지된다는 점입니다. 속성에 따라 데이터가 모호하지 않습니다. 두 번째 형식에서는이 정보가 손실됩니다. JSON 사양으로 형식을 지정하지 않습니다. AFAIK –

답변

30

두 번째는 대역폭에 약간의 비용을 절약 할 수 있지만 문제가된다면 JSON에 키를 채우지 않고 인덱스 배열을 사용하는 것입니다. 분명히 ["Foo Bar","Joe Blow"]은 현재 가지고있는 것보다 훨씬 짧습니다.

사용성 측면에서는 어떤 차이가 있다고 생각하지 않습니다. 두 경우 모두 if(json.isbn)else으로 건너 뜁니다. 일반적으로 null (값 없음)과 undefined (주어진 값 없음)을 구별 할 필요가 없습니다.

+7

+1 대개 null (값 없음)과 정의되지 않은 값 (주어진 값 없음)을 구별 할 필요가 없습니다. * 편리한 연산자도 있습니다!! = null' (비 엄격한 의도) – Esailija

+0

유일한 경우 브라우저가 특정 이벤트 유형을 지원하는지 테스트 할 수 있다고 생각할 수 있습니다. 예를 들어'on (typeof onbeforepaste == "undefined")'는'onBeforePaste'가 지원되는지 확인합니다. 그렇다고하더라도 원하는 이벤트를 모두 할당 할 수 있기 때문에 아무런 차이가 없습니다 (지원되지 않으면 아무 것도하지 않습니다). –

+0

그런 경우 나는 문서의''onbeforepaste ''를 테스트하여 속성의 존재를 테스트 할 것입니다. – Esailija

19

JavaScript에서 nullundefined과 매우 다른 의미입니다.

JSON 출력은 JSON 데이터를 사용하는 특정 컨텍스트에서 응용 프로그램에서 사용하고 필요로하는 것을 반영해야합니다.

+4

JSON에 "정의되지 않음"이 없으므로 "빈"속성을 포함할지 여부를 묻는 것 같아요. - {{ "prop": undefined} }'. – Bergi

+0

동의 함, 수신 측에서 null로 설정 될 특정 속성을 찾고있는 경우 해당 속성이 적용되지 않는다고 설명하려고합니다. 생략하면 정의되지 않습니다. – Brad

10

nullundefined은 자바 스크립트에서 두 가지 다른 의미가 있으므로 구분할 필요가있을 때 반드시 포함시켜야합니다. null은 속성이 알 수 없거나 의미가 없음을 의미하고 undefined은 속성이 존재하지 않는다고 생각할 수 있습니다.

다른 한편, 누군가가 그 구별을 할 필요가 없다면 계속해서 나가십시오.

71

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

서버와 프로토콜이 동의하는 한 서버에서 null을 전달하면 API가 나중에보다 유연 해집니다.

javascript의 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의 차이점을 이해해야합니다. 이 질문에 대한 대답은 사용자 요구 사항에 따라 다릅니다. – Jacob

+11

+1. 반대쪽에있는 사람 (코드를 작성한 사람)은 명시적인 값으로 더 잘 처리됩니다. 그들은 JavaScript를 작성하지 않을 수도 있습니다 ;-) – Steve11235

+2

null에 대한 검사는 ==, ===가 필요합니다 (undefined == null). – Tommy

0

사용자 경험을 뒷받침하는 데이터로 JSON을 사용하면 아무런 차이가 없다고 생각합니다.

사용자가 직접 뭔가를 편집해야하는 경우 JSON 구성 파일에 차이가 나타납니다. 첫 번째 예제를 사용하면 사용자에게 구성에 대한 힌트를 줄 수 있습니다.

+1

제공하는 솔루션에 대한 설명을 추가하여 답을 더 자세히 설명해 주시겠습니까? – abarisone

관련 문제