Перейти к содержанию
Fire Monkey от А до Я
  • 0

Проблема с добавление данных в масив


munhauz

Вопрос

Доброго дня народ. Сразу к сути.
есть ответ с сервера в формате JSON 

Скрытый текст



{
  "response": {
    "pipelines": {
      "804520": {
        "id": 804520,
        "value": 804520,
        "label": "Звонки",
        "name": "Звонки",
        "sort": 1,
        "is_main": true,
        "statuses": {
          "142": {
            "id": 142,
            "name": "В работе",
            "color": "#CCFF66",
            "sort": 10000,
            "editable": "N",
            "pipeline_id": 804520
          },
          "143": {
            "id": 143,
            "name": "Черный список",
            "color": "#D5D8DB",
            "sort": 11000,
            "editable": "N",
            "pipeline_id": 804520
          },
          "16662694": {
            "id": 16662694,
            "name": "Первичный контакт",
            "pipeline_id": 804520,
            "sort": 10,
            "color": "#99ccff",
            "editable": "Y"
          },
          "16681687": {
            "id": 16681687,
            "name": "Не интересно",
            "pipeline_id": 804520,
            "sort": 30,
            "color": "#ff8f92",
            "editable": "Y"
          },
          "17078218": {
            "id": 17078218,
            "name": "Интересно",
            "pipeline_id": 804520,
            "sort": 20,
            "color": "#fff000",
            "editable": "Y"
          }
        },
        "leads": 34
      },
      "804529": {
        "id": 804529,
        "value": 804529,
        "label": "E-mail",
        "name": "E-mail",
        "sort": 2,
        "is_main": false,
        "statuses": {
          "142": {
            "id": 142,
            "name": "В работе",
            "color": "#CCFF66",
            "sort": 10000,
            "editable": "N",
            "pipeline_id": 804529
          },
          "143": {
            "id": 143,
            "name": "Черный список",
            "color": "#D5D8DB",
            "sort": 11000,
            "editable": "N",
            "pipeline_id": 804529
          },
          "16662775": {
            "id": 16662775,
            "name": "Первичный контакт",
            "pipeline_id": 804529,
            "sort": 10,
            "color": "#99ccff",
            "editable": "Y"
          },
          "17040784": {
            "id": 17040784,
            "name": "Не интересно",
            "pipeline_id": 804529,
            "sort": 30,
            "color": "#ff8f92",
            "editable": "Y"
          },
          "17082589": {
            "id": 17082589,
            "name": "Интересно",
            "pipeline_id": 804529,
            "sort": 20,
            "color": "#fff000",
            "editable": "Y"
          }
        },
        "leads": 6
      },
      "839881": {
        "id": 839881,
        "value": 839881,
        "label": "Почта",
        "name": "Почта",
        "sort": 3,
        "is_main": false,
        "statuses": {
          "142": {
            "id": 142,
            "name": "В работе",
            "color": "#CCFF66",
            "sort": 10000,
            "editable": "N",
            "pipeline_id": 839881
          },
          "143": {
            "id": 143,
            "name": "Черный список",
            "color": "#D5D8DB",
            "sort": 11000,
            "editable": "N",
            "pipeline_id": 839881
          },
          "17073886": {
            "id": 17073886,
            "name": "Первичный контакт",
            "pipeline_id": 839881,
            "sort": 10,
            "color": "#99ccff",
            "editable": "Y"
          },
          "17073889": {
            "id": 17073889,
            "name": "Не интересно",
            "pipeline_id": 839881,
            "sort": 30,
            "color": "#ff8f92",
            "editable": "Y"
          },
          "17082592": {
            "id": 17082592,
            "name": "Интересно",
            "pipeline_id": 839881,
            "sort": 20,
            "color": "#fff000",
            "editable": "Y"
          }
        },
        "leads": 2
      },
      "839884": {
        "id": 839884,
        "value": 839884,
        "label": "Соц сети",
        "name": "Соц сети",
        "sort": 4,
        "is_main": false,
        "statuses": {
          "142": {
            "id": 142,
            "name": "В работе",
            "color": "#CCFF66",
            "sort": 10000,
            "editable": "N",
            "pipeline_id": 839884
          },
          "143": {
            "id": 143,
            "name": "Черный список",
            "color": "#D5D8DB",
            "sort": 11000,
            "editable": "N",
            "pipeline_id": 839884
          },
          "17073895": {
            "id": 17073895,
            "name": "Первичный контакт",
            "pipeline_id": 839884,
            "sort": 10,
            "color": "#99ccff",
            "editable": "Y"
          },
          "17073898": {
            "id": 17073898,
            "name": "Не интересно",
            "pipeline_id": 839884,
            "sort": 30,
            "color": "#ff8f92",
            "editable": "Y"
          },
          "17082595": {
            "id": 17082595,
            "name": "Интересно",
            "pipeline_id": 839884,
            "sort": 20,
            "color": "#fff000",
            "editable": "Y"
          }
        },
        "leads": 0
      },
      "839887": {
        "id": 839887,
        "value": 839887,
        "label": "Другое",
        "name": "Другое",
        "sort": 5,
        "is_main": false,
        "statuses": {
          "142": {
            "id": 142,
            "name": "В работе",
            "color": "#CCFF66",
            "sort": 10000,
            "editable": "N",
            "pipeline_id": 839887
          },
          "143": {
            "id": 143,
            "name": "Черный список",
            "color": "#D5D8DB",
            "sort": 11000,
            "editable": "N",
            "pipeline_id": 839887
          },
          "17073904": {
            "id": 17073904,
            "name": "Первичный контакт",
            "pipeline_id": 839887,
            "sort": 10,
            "color": "#99ccff",
            "editable": "Y"
          },
          "17073907": {
            "id": 17073907,
            "name": "Не интересно",
            "pipeline_id": 839887,
            "sort": 30,
            "color": "#ff8f92",
            "editable": "Y"
          },
          "17082598": {
            "id": 17082598,
            "name": "Интересно",
            "pipeline_id": 839887,
            "sort": 20,
            "color": "#fff000",
            "editable": "Y"
          }
        },
        "leads": 0
      }
    },
    "colors": [
      "#fffeb2",
      "#fffd7f",
      "#fff000",
      "#ffeab2",
      "#ffdc7f",
      "#ffce5a",
      "#ffdbdb",
      "#ffc8c8",
      "#ff8f92",
      "#d6eaff",
      "#c1e0ff",
      "#98cbff",
      "#ebffb1",
      "#deff81",
      "#87f2c0",
      "#f9deff",
      "#f3beff",
      "#ccc8f9",
      "#eb93ff",
      "#f2f3f4",
      "#e6e8ea"
    ],
    "server_time": 1509727339
  }
}

 

таким вот форматом 

мне нужно несколько данных что бы потом формировать с ними запросы 

нужны ID 

пишу на Delphi 10 

      JSO := TJSONObject.ParseJSONValue(html) as TJSONObject;
      if Assigned(JSO) then
        begin
          JSO := TJSONObject.ParseJSONValue(JSO.GetValue('response').ToString) as TJSONObject;
          JsA := TJSONObject.ParseJSONValue(JSO.GetValue('pipelines').ToString) as TJSONArray;
          JSO := TJSONObject.ParseJSONValue(JsA.Items[0].ToString) as TJSONObject;
          frm_main.Memo1.text := JSO.GetValue('id').value;
        end;

html загружается сам JSON ответ по GET запросу

    JSO: TJSONObject;
    JsA: TJSONArray;

в данной строке ошибка 

 JsA := TJSONObject.ParseJSONValue(JSO.GetValue('pipelines').ToString) as TJSONArray;

не соответствие типов 

в JSON работаю впервые потому понимаю что ошибка может быть детская . если накидаете ссылки на хорошую литературу по тому как работать с JSON тоже буду благодарен 

 

Изменено пользователем Andrey Efimov
Добавил тег "Спойлер"
Ссылка на комментарий

Рекомендуемые сообщения

  • 1
6 часов назад, munhauz сказал:

в данной строке ошибка 


 JsA := TJSONObject.ParseJSONValue(JSO.GetValue('pipelines').ToString) as TJSONArray;

не соответствие типов 

Ошибка возникает из-за того, что элемент pipelines является TJSONObject (фигурные скобки «{ }»), а не TJSONArray (квадратные скобки «[ ]»). Как я понял из вашего примера, обращаться к id значению не требуется, т.к. элементы объекта pipelines являются исходными номерами. Для этого можно использовать следующий код:

function GetIds(const AIn, APath: string): TArray<Integer>;
var
  jIn, jIds: TJSONObject;
  jEnum: TJSONPairEnumerator;
  lCount, i: Integer;
begin
  Result := [];
  jIn := TJSONObject.ParseJSONValue(AIn) as TJSONObject;
  if not (Assigned(jIn) and jIn.TryGetValue<TJSONObject>(APath, jIds)) then
    Exit;
  lCount := jIds.Count;
  SetLength(Result, lCount);
  for i := 0 to lCount - 1 do
    Result[i] := jIds.Pairs[i].JsonString.GetValue<Integer>('', -1);
end;
  
 //вызывать так:
  GetIds(<json string>, 'response.pipelines');

 

6 часов назад, munhauz сказал:

в JSON работаю впервые потому понимаю что ошибка может быть детская . если накидаете ссылки на хорошую литературу по тому как работать с JSON тоже буду благодарен 

Это легкий формат, посмотрите используемые типы на любом ресурсе (случайная ссылка, еще одна случайная ссылка) и дальше просто смотрите примеры работы.

В Delphi лучше использовать сторонние библиотеки для работы с этим форматом, т.к. они выигрывают в производительности и легче в использовании: x-superobjectJsonDataObjects, и др.

Ссылка на комментарий
  • 0

Ок. спасибо, осознал проблему .теперь еще вопрос , как добраться до поля name  


      JSO := TJSONObject.ParseJSONValue(JSO.GetValue('response').ToString) as TJSONObject;
      JSO := TJSONObject.ParseJSONValue(JSO.GetValue('pipelines').ToString) as TJSONObject;
      frm_main.Memo1.text := JSO.GetValue('name').value;

выдает ошибку 

Ссылка на комментарий
  • 0
  • Модераторы

когда-то давно написал такую штуку (только не все поддерживается, в Readme написано)

в вашем случае будет вот такие структуры

Скрытый текст

TmyType16662694 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType839887 = record
  id: integer;
  value: integer;
  label: string;
  name: string;
  sort: integer;
  is_main: boolean;
  statuses: TmyTypeStatuses;
  leads: integer;
end;

TmyType16662775 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType17082592 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType804520 = record
  id: integer;
  value: integer;
  label: string;
  name: string;
  sort: integer;
  is_main: boolean;
  statuses: TObject;
  leads: integer;
end;

TmyType142 = record
  id: integer;
  name: string;
  color: string;
  sort: integer;
  editable: string;
  pipeline_id: integer;
end;

TmyTypeResponse = record
  pipelines: TmyTypePipelines;
  server_time: integer;
end;

TmyType143 = record
  id: integer;
  name: string;
  color: string;
  sort: integer;
  editable: string;
  pipeline_id: integer;
end;

TmyType17082598 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType17073886 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType17040784 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyTypeStatuses = record
  142: TmyType142;
  143: TmyType143;
  17073904: TObject;
  17073907: TmyType17073907;
  17082598: TmyType17082598;
end;

TmyType17073907 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType17073889 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType16681687 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyTypePipelines = record
  804520: TmyType804520;
  804529: TObject;
  839881: TmyType839881;
  839884: TObject;
  839887: TmyType839887;
end;

TmyType17073898 = record
  id: integer;
  name: string;
  pipeline_id: integer;
  sort: integer;
  color: string;
  editable: string;
end;

TmyType839881 = record
  id: integer;
  value: integer;
  label: string;
  name: string;
  sort: integer;
  is_main: boolean;
  statuses: TObject;
  leads: integer;
end;

TmyTypeRecord = record
  response: TmyTypeResponse;
end;

не поддерживается только массив colors

использую в связке с XSuperObject

var
	aRecord: TmyTypeRecord;
begin
	aRecord := TJson.Parse<TmyTypeRecord>(aJsonString);
    

где aJsonString - ваш ответ с сервера

дальше работа идёт делфовыми структурами, удобней в разы

P.S. увидел пару недочетов в программе, надо будет в будущем поправить.

но описать 3-4 структуры не должно составить труда (если они нужны)

Ссылка на комментарий

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить на вопрос...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...