человекочитаемое значение float в JSON

Общие вопросы программирования, алгоритмы и т.п.

Модератор: Модераторы

человекочитаемое значение float в JSON

Сообщение ssnakess » 12.11.2023 11:45:29

Доброго времени суток!
Пишу данные в структуру json. Для работы с ним использую fpJSON.
Код: Выделить всё
....
Var obj:TJSONObject;
      p:Real;
....
  p:=1500;
  obj.Add('price',p);
.....


В файле, который получаю после записи json-объекта, получаю следующее:
Код: Выделить всё
  ...
  "price" : 1.5000000000000000E+003,
  ...


Вопрос, как записать значение float в json в нормальном виде, привычным для чтения.
Т.е. например как в данном случае получить в файле
Код: Выделить всё
  "price" : 1500.0,


Понятно что можно писать значение используя format, но тогда это будет строка, а не float :(
Может есть какая-то совсем спрятанная настройка этого TJSONObject которая бы указывала в каком стиле писать float ?

Добавлено спустя 53 минуты 50 секунд:
Сам себе отвечаю - без изменения в исходнике этого модуля - ни как :((
Код: Выделить всё
function TJSONFloatNumber.GetAsString: TJSONStringType;
begin
  Str(FValue,Result);
  // Str produces a ' ' in front where the - can go.
  if (Result<>'') and (Result[1]=' ') then
    Delete(Result,1,1);
end;


Функция Str поддерживает указание количества знаков после точки и если в данном случае указать количество то запись в json приобретет нормальный человекочитаемый формат, такой же как например результат функции FloatToStr
но не хочется менять код этого модуля
ssnakess
новенький
 
Сообщения: 36
Зарегистрирован: 24.09.2011 23:08:55

Re: человекочитаемое значение float в JSON

Сообщение iskander » 12.11.2023 13:58:14

Это известный (и не единственный) недостаток библиотеки fcl-json, в вике даже предлагается способ его преодоления, но проблему целиком это не решает.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: человекочитаемое значение float в JSON

Сообщение ssnakess » 14.11.2023 16:54:02

iskander писал(а):Это известный (и не единственный) недостаток библиотеки fcl-json, в вике даже предлагается способ его преодоления, но проблему целиком это не решает.

В принципе почему нет.
Спасибо за ссылку.
А можете немного пояснить... я первый раз сталкиваюсь с таким вот ....
Код: Выделить всё
  DefaultJSONInstanceTypes :
    Array [TJSONInstanceType] of TJSONDataClass = (
      TJSONData,
      TJSONIntegerNumber,
      {$IFNDEF PAS2JS}
      TJSONInt64Number,
      TJSONQWordNumber,
      {$ELSE}
      TJSONNativeIntNumber,
      {$ENDIF}
      TJSONFloatNumber,
      TJSONString,
      TJSONBoolean,
      TJSONNull,
      TJSONArray,
      TJSONObject);     


Т.е. это массив, где индекс это перечисление TJSONDataClass,
но тогда что такое элементы этого массива? это не экземпляры класса.... т.е. что в данном случае является элементом массива?
и как тогда будет выглядеть создание экземпляра?

el := DefaultJSONInstanceTypes[jitNumberFloat].Create();

???
ssnakess
новенький
 
Сообщения: 36
Зарегистрирован: 24.09.2011 23:08:55

Re: человекочитаемое значение float в JSON

Сообщение iskander » 14.11.2023 20:16:05

ssnakess писал(а):что такое элементы этого массива? это не экземпляры класса.... т.е. что в данном случае является элементом массива?

Ссылки на класс(как Тип) aka Class-Reference Types.
ssnakess писал(а):и как тогда будет выглядеть создание экземпляра?

el := DefaultJSONInstanceTypes[jitNumberFloat].Create();

???

Примерно так оно и есть:
Код: Выделить всё
function CreateJSON(Data: TJSONFloat): TJSONFloatNumber;
begin
  Result:=TJSONFloatNumberCLass(DefaultJSONInstanceTypes[jitNumberFloat]).Create(Data);
end;

Наверно имеет смысл ещё отметить, что вышеупомянутый фокус не всегда в полной мере обеспечивает ожидаемый эффект, и к тому же изрядно тормозной.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34


Вернуться в Общее

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 43

Рейтинг@Mail.ru