JSON에서 null을 나타내는
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>
각각의 파싱을 평가 해 봅시다 :
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
정의하지만, 사진이 게시되지 :.
null
0이 아닙니다. 값 자체 는 아닙니다 . 데이터가 없거나 알 수 없음을 나타내는 변수 영역 외부의 값입니다.
null
JSON 에는 표현할 수 있는 유일한 방법이 있습니다 . 사양에 따라 ( RFC 4627 및 json.org ) :
2.1. 가치 JSON 값은 객체, 배열, 숫자 또는 문자열이거나 다음 중 하나 여야합니다. 다음 세 가지 리터럴 이름 : 거짓 null 참
표현하는 방법은 하나뿐입니다 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": [] }
null
특정 키에 대한 값이 없음을 보여주기 위해 사용 합니다. 예를 들어, null
"가정에있는 장치 수가 인터넷에 연결되어 있음"을 나타내는 데 사용 하십시오.
반면 {}
특정 키가 적용되지 않는 경우 사용 하십시오. 예를 들어, null
자동차를 소유하지 않은 사람에게 "인터넷 연결이 활성화 된 자동차 수"라는 질문에 대한 개수를 표시해서는 안됩니다 .
그 기본값이 의미가 없으면 값을 기본값으로 사용하지 마십시오. null
값을 나타내지 않기 위해 사용 하기로 결정할 수도 있지만 반드시 "null"
그렇게하지는 마십시오.
변수의 데이터 유형 ( null
문자열 / 객체, 0
숫자)에 대해 "default"를 선택 하지만 실제로 객체를 소비 할 코드는 무엇인지 확인하십시오. 때때로 null
/ default와 "not present" 사이에 차이가 있다는 것을 잊지 마십시오 .
null 객체 패턴을 확인하십시오 -때로는 특별한 객체를 대신 전달하는 것이 좋습니다 null
(예 : []
배열 null
또는 ""
문자열 대신 배열 ).
이것은 개인적이고 상황에 맞는 선택입니다. 기억해야 할 중요한 것은 빈 문자열과 숫자 0은 개념적으로 구별된다는 것입니다 null
.
의 경우 count
항상 유효한 숫자를 원할 것입니다 ( count
알 수 없거나 정의되지 않은 경우 제외). 문자열의 경우 누가 알 수 있습니까? 빈 문자열은 애플리케이션에서 무언가를 의미 할 수 있습니다. 아니면 아닐 수도 있습니다. 결정하는 것은 당신에게 달려 있습니다.
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
참고 URL : https://stackoverflow.com/questions/21120999/representing-null-in-json
'development' 카테고리의 다른 글
null 검사가없는 경우에도 캐스트 대신 "as"를 사용하는 것이 합리적입니까? (0) | 2020.03.01 |
---|---|
비동기 및 비 차단 (0) | 2020.03.01 |
Objective-C에서 클래스에 대한 개인 메소드를 정의하는 가장 좋은 방법 (0) | 2020.03.01 |
힘내 충돌 마커 (0) | 2020.03.01 |
Windows 명령 프롬프트 출력 표시 및 파일로 리디렉션 (0) | 2020.03.01 |