Хитроумный TJSONNumber: как определиться с Integer или Float?
Например, парсим строку вида {"Key":"Этот строка"}. Тут он легко соображает, что это TJSONString, и в вариант очень просто запихнуть строку:
Код:
procedure TRequestParamObject._SetJSON(const Value: TJSONValue);
var
V: TJSONValue;
FParamValue: Variant;
begin
V := (Value as TJSONObject).Get('Key').JsonValue;
if V is TJSONString then
FParamValue := V.Value;
var
V: TJSONValue;
FParamValue: Variant;
begin
V := (Value as TJSONObject).Get('Key').JsonValue;
if V is TJSONString then
FParamValue := V.Value;
{"Key":false}
Код:
if (V is TJSONTrue) or (V is TJSONFalse) then
FParamValue := StrToBool(V.Value);
FParamValue := StrToBool(V.Value);
Например, два случая:
{"Key":465746} и {"Key":1254.3658}
В обоих случаях они будут TJSONNumber, и остаётся загадкой, как их интерпретировать, чтобы применить правильную функцию приведения. Например, в первом случае ничего страшного не случится, если я напишу
Код:
if V is TJSONNumber then
FParamValue := StrToFloat(V.Value);
FParamValue := StrToFloat(V.Value);
К тому же я сильно заинтересован, чтобы тип в варианте был конкретно varInteger или varDouble, взависимости от того что мне нужно.
Как с этим быть? Есть ли какие-то готовые механизмы проверки?
Код:
if V is TJSONNumber then
begin
if Frac(StrToFloat(V.Value)) <> 0 then
FParamValue := StrToFloat(V.Value)
else
FParamValue := StrToInt(V.Value);
end;
begin
if Frac(StrToFloat(V.Value)) <> 0 then
FParamValue := StrToFloat(V.Value)
else
FParamValue := StrToInt(V.Value);
end;
Наверное, это самое простое что можно сделать в данном случае.
Вполне разумно, если только целая часть веществ. числа не превысит емкости инта. Например, 5 000 000 000,0 :)