development

JSON에서 null을 나타내는

big-blog 2020. 3. 1. 15:56
반응형

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

이 표현하는 확실한 방법입니다 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정의하지만, 사진이 게시되지 :.


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

nullJSON 에는 표현할 수 있는 유일한 방법이 있습니다 . 사양에 따라 ( RFC 4627json.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



반응형