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

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

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

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

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

Сообщение ssnakess »

Доброго времени суток!
Пишу данные в структуру 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
но не хочется менять код этого модуля
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

Это известный (и не единственный) недостаток библиотеки fcl-json, в вике даже предлагается способ его преодоления, но проблему целиком это не решает.
ssnakess
новенький
Сообщения: 47
Зарегистрирован: 24.09.2011 23:08:55

Сообщение ssnakess »

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();

???
iskander
энтузиаст
Сообщения: 630
Зарегистрирован: 08.01.2012 18:43:34

Сообщение iskander »

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

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

???
Примерно так оно и есть:

Код: Выделить всё

function CreateJSON(Data: TJSONFloat): TJSONFloatNumber;
begin
  Result:=TJSONFloatNumberCLass(DefaultJSONInstanceTypes[jitNumberFloat]).Create(Data);
end;
Наверно имеет смысл ещё отметить, что вышеупомянутый фокус не всегда в полной мере обеспечивает ожидаемый эффект, и к тому же изрядно тормозной.
jsa
постоялец
Сообщения: 295
Зарегистрирован: 28.11.2017 12:46:04

Сообщение jsa »

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