프로그래밍 언어/HTML,CSS,JS

JSON에서 null 표시

Rateye 2021. 7. 20. 10:42
728x90
반응형

 

질문 : JSON에서 null 표시

JSON에서 null 값을 반환하는 데 선호되는 방법은 무엇입니까? 프리미티브에 대한 다른 선호도가 있습니까?

예를 들어 서버의 개체에 값이없는 "myCount"라는 정수가있는 경우 해당 값에 대한 가장 정확한 JSON은 다음과 같습니다.

{}

또는

{
    "myCount": null
}

또는

{
    "myCount": 0
}

문자열에 대한 동일한 질문-서버에 null 문자열 "myString"이있는 경우 최상의 JSON입니다.

{}
        

또는

{
      "myString": null
}

또는

{
     "myString": ""
}

또는

{
     "myString": "null"
}

빈 컬렉션 http://jtechies.blogspot.nl/2012/07/item-43-return-empty-arrays-or.html 로 JSON에 표시되는 컬렉션에 대한 규칙을 좋아합니다.

빈 배열이 표시됩니다.

{
        "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()));
   }
}

Maven 종속성 :

<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은 실패합니다.

이것은 JSON 사양에 따라 null 을 나타내는 확실한 방법입니다.

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 : 정의가 반환되지만 게시 된 사진은 없습니다.

출처 : https://stackoverflow.com/questions/21120999/representing-null-in-json
728x90
반응형