JSON type 중 number 형식이 있다. 스펙에는 제한이 없다고 한다. 

하지만 IEEE 754-2008 binary64( double precision ) number 로 구현되는 경우가 많다. 부동 소수점 오류나 int64 정수 크기의 문제가 있을 수 있어 int64 를 같이 저장공간으로 사용하기도 한다.

Unreal 도 FJsonValueNumber 를 보면 double 만 사용하고 있다. (4.23)

/** A Json Number Value. */
class JSON_API FJsonValueNumber : public FJsonValue
{

public:

FJsonValueNumber(double InNumber) : Value(InNumber) {Type = EJson::Number;}
virtual bool TryGetNumber(double& OutNumber) const override { OutNumber = Value; return true; }
virtual bool TryGetBool(bool& OutBool) const override { OutBool = (Value != 0.0); return true; }
virtual bool TryGetString(FString& OutString) const override { OutString = FString::SanitizeFloat(Value, 0); return true; }

protected:

double Value;

virtual FString GetType() const override {return TEXT("Number");}

};

부동소수점 오류가 생기는 상황을 피하기 위해서 FJsonValueNumberStrirng 이 추가되었다. (4.25)

/** A Json Number Value, stored internally as a string so as not to lose precision */

class JSON_API FJsonValueNumberString : public FJsonValue
{

public:

FJsonValueNumberString(const FString& InString) : Value(InString) { Type = EJson::Number; }


virtual bool TryGetString(FString& OutString) const override { OutString = Value; return true; }
virtual bool TryGetNumber(double& OutDouble) const override { return LexTryParseString(OutDouble, *Value); }
virtual bool TryGetNumber(float &OutDouble) const override { return LexTryParseString(OutDouble, *Value); }
virtual bool TryGetNumber(int8& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(int16& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(int32& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(int64& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint8& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint16& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint32& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetNumber(uint64& OutValue) const override { return LexTryParseString(OutValue, *Value); }
virtual bool TryGetBool(bool& OutBool) const override { OutBool = Value.ToBool(); return true; }

protected:

FString Value;

virtual FString GetType() const override { return TEXT("NumberString"); }

};

* 참고

Introduction JSON

JSON integers : limit on size

RFC 7159 : The JavaScript Object Notation (JSON) Data Interchange Format

728x90

+ Recent posts