Страница 1 из 1

fpjson имя ключа содержит точку

СообщениеДобавлено: 02.09.2021 11:31:43
lodka
Добрый день!

Работаю с json при помощи fpjson. Как взять значение ключа, если имя ключа содержит точку?

Код: Выделить всё
{
    "pp": "8f49ff23",
    "ars": {
        "attach.id": "468"
     }
}


JSONData.FindPath('attach.id'); будет искать вложенный в attach ключ id

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 02.09.2021 13:52:25
sts
JSONData.FindPath('"attach.id"') ?
нет возможности проверить

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 02.09.2021 14:13:33
lodka
Пробовал, не находит.

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 02.09.2021 16:09:32
iskander
lodka писал(а):Работаю с json при помощи fpjson. Как взять значение ключа, если имя ключа содержит точку?

Имхо чисто с помощью FindPath() никак, во всяком случае, в текущем состоянии FpJson.
Как-нибудь костыльно
Код: Выделить всё
  Found := JsonData.FindPath('ars');
  if (Found <> nil) and (Found.JSONType = jtObject) then
    Found := TJsonObject(Found).Find('attach.id');

Или наваять собственную функцию
Код: Выделить всё
  FpJsonFindPath(Root: TJsonData; Path: array of string; out Value: TJsonData): Boolean;
  begin
    ...
  end;

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 02.09.2021 19:12:22
sts
с годик назад по либе вопросы поднимали на форуме, я посмотрел исходники - там все переписывать надо, что я и сделал для проверки, но в "нормализованном" виде она теряет обратную совместимость.

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 02.09.2021 19:50:07
iskander
sts писал(а):с годик назад по либе вопросы поднимали на форуме, я посмотрел исходники - там все переписывать надо, что я и сделал для проверки...

Только для себя, или это можно где-то увидеть и попробовать?

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 03.09.2021 06:08:55
lodka
1. Как вывести имена ключей средствами fpjson?
2. Какие библиотеки используете вы для для работы с json?

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 03.09.2021 10:17:49
sts
iskander писал(а):Только для себя, или это можно где-то увидеть и попробовать?

доступа к компу где делал не имею ща, за выходные попробую нарыть исходники
lodka писал(а): Какие библиотеки используете вы для для работы с json?

на делфе superobject.pas - она на интерфейсах, json\xml, в принципе - медленная, по идее fpjson быстрее и меньше памяти жрет

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 03.09.2021 10:54:55
iskander
lodka писал(а):1. Как вывести имена ключей средствами fpjson?
2. Какие библиотеки используете вы для для работы с json?

1. Если я правильно путаю и требуются значения ключей в объекте
Код: Выделить всё
program get_obj_keys;
{$mode objfpc}
uses
  SysUtils, FpJson;
var
  e: TJsonEnum;
  I: Integer;
  d: TJsonData;
begin
  d := TJsonObject.Create(['key.1', 100, 'key.2', 200, 'key.3', 300]);
  WriteLn('first way:');
  for e in d do
    WriteLn(e.Key);
  WriteLn('second way:');
  for I := 0 to d.Count - 1 do
    WriteLn(TJsonObject(d).Names[I]);
  d.Free;
end.   

Кстати, FpJson имеет весьма обширную справку.

2. FpJson, конечно, изрядно неуклюжий и местами косячный, зато всегда доступен в актуальном состоянии.
Из сторонних, возможно, самая компактная реализация это JsonTools.
Вероятно, самый строгий парсер у lgJson

Re: fpjson имя ключа содержит точку

СообщениеДобавлено: 03.09.2021 11:24:38
lodka
Спасибо!