масив json

VladimirVVP
Дата: 04.06.2019 19:27:15
мне нужно из этого ответа

{"success":"1","days":"3","products":[
{"1":{"id":"1","login":"33","password":"432","firstName":"23423","lastName":"234324","id_user":"1"},
"2":{"id":"2","login":"2222","password":"2333","firstName":"3333","lastName":"34234","id_user":"1"}}]}

получить firstName и lastName

    procedure DUAll;
var
JSONObject, JSONObjProp: TJSONObject;
JSONString: TJSONString;
JsonArray, JsonArrayCoord: TJSONArray;
i:integer;
begin
 try
 if http.Status() = 200 then
        begin
          frmAdmin.Memo1.Text:=http.responsetext;
          JSONObject:=TJSONObject(TJSONObject.ParseJSONValue(http.responsetext));
        if JSONObject <> nil then begin
            JSONString:=TJSONString(JSONObject.GetPairByName('success').JsonValue);
            if Pos('not session', JSONString.Value) > 0  then begin
            timerAu.Enabled:=False;
            frmAdmin.bAutorization.Caption:='Ошибка авторизации'; end else
            if Pos('1', JSONString.Value) > 0  then begin
                JSONString:=TJSONString(JSONObject.GetPairByName('days').JsonValue);
                frmAdmin.bDays.Caption:='Осталось '+JSONString.Value+' дней';
                JsonArray:=TJSONArray(JSONObject.GetPairByName('products').JsonValue);
                for i := 0 to JsonArray.Size-1  do begin
                  [b]  //  и тут я повис )))[/b]
                end;
                timerAu.Enabled:=False;
            end;
           end;
         end;
    except
      //frmAdmin.bAutorization.Caption:='соединение...';
    end;

end;
Gerasimenko
Дата: 04.06.2019 19:35:23
VladimirVVP,

самое простое, наверное, TStringList с разделителем ":"
asutp2
Дата: 04.06.2019 21:41:07
VladimirVVP,

procedure Parse(AText: string; out ADays: Integer);
var
  I: Integer;
  LJson: TJSONObject;
  LProductsNode: TJSONValue;
  LItemNode: TJSONValue;
  LDataNode: TJSONValue;
begin
  ADays := -1;
  LJson := TJSONObject.ParseJSONValue(AText) as TJSONObject;
  if Assigned(LJson) then
  begin
    try
      if LJson.Count > 0 then
      begin
        if TJSONString(LJson.Values['success']).Value = '1' then
        begin
          ADays := StrToInt(TJSONString(LJson.Values['days']).Value);
          LProductsNode := LJson.Values['products'];
          if Assigned(LProductsNode) then
          begin
            with TJSONArray(LProductsNode) do
            begin
              if Count > 0 then
                for I := 0 to Count - 1 do
                begin
                  LItemNode := Items[I];
                  if Assigned(LItemNode) then
                  begin
                    with TJSONObject(LItemNode) do
                    begin
                      LDataNode := Values[IntToStr(I + 1)];
                      if Assigned(LDataNode) then
                      begin
                        with TJSONObject(LDataNode) do
                        begin
                          // данные i-го элемента, получаемые в цикле:
                          // firstName := TJSONString(Values['firstName']).Value;
                          // lastName:= TJSONString(Values['lastName']).Value;
                        end;
                      end;
                    end;
                  end;
                end;
            end;
          end;
        end;
      end;
    finally
      LJson.DisposeOf;
    end;
  end;
end;
DmSer
Дата: 05.06.2019 23:48:17
И что заставляет людей так составлять json-массивы? :(
Еще чуднее пример:
{1:{...}, 2;{...}, 5:{...}, 10:{...} }
Парсите наздоровье!
kealon(Ruslan)
Дата: 06.06.2019 00:19:48
VladimirVVP,

в 10-ке десериализатор есть, ищи в папке REST, по слову reflect
Дегтярев Евгений
Дата: 06.06.2019 06:44:43
DmSer
Еще чуднее пример:
{1:{...}, 2;{...}, 5:{...}, 10:{...} }
Парсите наздоровье!

чем он чуднее? тем что невалиден?
asutp2
Дата: 06.06.2019 09:40:17
kealon(Ruslan)
VladimirVVP,

в 10-ке десериализатор есть, ищи в папке REST, по слову reflect

сериализация хороша, когда структура данных в json жестко зафиксирована. Удаление хотя бы одного поля в структуре сломает парсинг (например в новой версии структуру изменили и новая версия приложения ее поддерживает, а вот предыдущие версии перестают работать), поэтому ручками парсить надежнее

Дегтярев Евгений
DmSer
Еще чуднее пример:
{1:{...}, 2;{...}, 5:{...}, 10:{...} }
Парсите наздоровье!

чем он чуднее? тем что невалиден?

лично я бы предпочел, чтобы массив хранился в виде "products":[{"index":"1",..},{"index":"2",..},{"index":"10",..}]
kealon(Ruslan)
Дата: 06.06.2019 10:46:46
asutp2
kealon(Ruslan)
VladimirVVP,

в 10-ке десериализатор есть, ищи в папке REST, по слову reflect

сериализация хороша, когда структура данных в json жестко зафиксирована. Удаление хотя бы одного поля в структуре сломает парсинг (например в новой версии структуру изменили и новая версия приложения ее поддерживает, а вот предыдущие версии перестают работать), поэтому ручками парсить надежнее
вот с новой версией структуру поменяли а у тебя всё работает ибо ручками написал :-)
ога, как же ..., в реале у тебя куча гумнокода который непонятно как и где исправлять
валидацию ожидание-реальность просто нужно делать хотя бы в дебуге
ёёёёё
Дата: 06.06.2019 11:21:37
VladimirVVP,

какая-то у тебя глупая структура:
{
 "success": "1",
 "days": "3",
 "products": [
  {
   "2": {
    "firstName": "3333",
    "login": "2222",
    "id_user": "1",
    "lastName": "34234",
    "id": "2",
    "password": "2333"
   },
   "1": {
    "firstName": "23423",
    "login": "33",
    "id_user": "1",
    "lastName": "234324",
    "id": "1",
    "password": "432"
   }
  }]
}

"products" - это массив с одним анонимным "{}" объектом, в котором - два объекта, странным образом именованные "2" и "1".

Ну да ладно.
+

const
  cSrc = ''
    + '{'
    + ' "success": "1",'
    + ' "days": "3",'
    + ' "products": ['
    + '  {'
    + '   "2": {'
    + '    "firstName": "3333",'
    + '    "login": "2222",'
    + '    "id_user": "1",'
    + '    "lastName": "34234",'
    + '    "id": "2",'
    + '    "password": "2333"'
    + '   },'
    + '   "1": {'
    + '    "firstName": "23423",'
    + '    "login": "33",'
    + '    "id_user": "1",'
    + '    "lastName": "234324",'
    + '    "id": "1",'
    + '    "password": "432"'
    + '   }'
    + '  }]'
    + '}'
  ;

var
  fSO: ISuperObject;
  fItem: ISuperObject;
  fIter: TSuperObjectIter;
  i: Integer;
  fSL: TStringList;

begin
  fSO := SO(cSrc);
  fSO := fSO.A['products'][0];
  fSL := TStringList.Create;
  try
    if ObjectFindFirst(fSO, fIter) then begin
      repeat
        fItem := fIter.val;
        fSL.Add(Format('"%s" firstName="%s" lastName="%s"',
                [fIter.key, fItem.S['firstName'], fItem.S['lastName']]))
      until not ObjectFindNext(fIter);
    end;
    ObjectFindClose(fIter);
    ShowMessage(fSL.Text);
  finally
    fSL.Free
  end;
end;

Ах, да.
uses
  superobject;
asutp2
Дата: 06.06.2019 12:46:49
kealon(Ruslan),

когда парсинг пишешь ручками, можно делать какие угодно динамические проверки и динамическую обработку на поля/значения/ и т.д., парсинг отработает. При сериализации это мягко говоря недоступно :-) и это опыт именно реального использования