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"); }
};
* 참고
RFC 7159 : The JavaScript Object Notation (JSON) Data Interchange Format