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

Еще раз про разбор JSON - массива


bssat

Вопрос

Господа, прошу не пинать, что-то совсем зарапортовался.

Здесь в соседней ветке обсуждался разбор массива, но там он состоял из пар - ключ:значение. А если массив типа такого?
{"desc":"Описания...","otdel":["1","12","300"],"manufacturer":"ООО \"Привет\""}

Мне нужно получить значения массива otdel. Как здесь быть? Понимаю, что решение простое, но говорю, ка отрубило... desc и manufacturer - тут просто:

JS := TJSONObject.ParseJSONValue(JSONText) as TJSONObject;
  if Assigned(JS) then
  begin
    // Заполняем Описание товара
    desc := WithoutDQuotes(JS.GetValue('desc').ToString);
    manufacturer := WithoutDQuotes(JS.GetValue('manufacturer').ToString);
    memOpisanie.Lines.Clear;
    memOpisanie.Lines.Add('Производитель: ' + manufacturer);
    memOpisanie.Lines.Add('Описание товара: ' + desc);
...

Как быть с массивом? Заранее благодарен за адекватный ответ.

Изменено пользователем bssat
Ссылка на комментарий

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

  • 0

рекомендую глянуть очень удобную библиотеку

x-superobject

там это будет выглядеть так

x:ISuperObject;

 

x:=TSuperObject.Create;

отдел1

x.A['otdel'].i[0];

отдел2

x.A['otdel'].i[1];

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

А если стандартными методами? К тому же, как из джейсона сделать суперобжект?

function JSONParse(const aJSONData: string; const aMemo: TMemo): boolean;
var
  aJSValue: TJSONValue;
  aJSObject: TJSONObject;
  aJSArray: TJSONArray;
  I, J: integer;
begin
  Result := false;
  aJSValue := TJSONObject.ParseJSONValue(aJSONData) as TJSONValue;
  if Assigned(aJSValue) then
  begin
    aJSObject := aJSValue as TJSONObject;

    if Assigned(aJSObject) then
    begin
      for I := 0 to aJSObject.Count - 1 do
      begin
        aMemo.Lines.Add(aJSObject.Pairs[I].JsonString.Value + '=' + aJSObject.Pairs[I].JsonValue.Value);

        if aJSObject.GetValue(aJSObject.Pairs[I].JsonString.Value) is TJSONArray then
        begin
          aJSArray := aJSObject.GetValue(aJSObject.Pairs[I].JsonString.Value) as TJSONArray;
          if Assigned(aJSArray) then
          begin
            for J := 0 to aJSArray.Count - 1 do
              aMemo.Lines.Add(aJSArray.Items[J].Value);
          end;
        end;
      end;
    end;
  end;
  Result := true;
end;
JSONParse('{"desc":"Описания...","otdel":["1","12","300"],"manufacturer":"ООО \"Привет\""}', Memo1)
Изменено пользователем ZuBy
Ссылка на комментарий
  • 0

Ребят, возник ещё вопрос. А как разбирать Джейсон, если он представляет собой один массив, который состоит из Джейсон объектов? Если его начинаю парcить как объект, он равен nil. Спасибо.

Изменено пользователем bssat
Ссылка на комментарий
  • 0

Ну вот джейсон.

[{"quantity":null,"price":null,"title":"Аспирин C шип. таб. №10(Байер)","id":42636,"image":null},{"quantity":null,"price":null,"title":"Аспирин комплекс пак. №10(Байер)","id":42641,"image":null},{"quantity":null,"price":null,"title":"Аспирин кардио таб. п/о100мг №56 (Байер РХ)","id":42639,"image":null},{"quantity":null,"price":null,"title":"Аспирин Экспресс шип. таб.0.5г №12 (Байер)","id":42637,"image":null},{"quantity":null,"price":null,"title":"Аспирин кардио таб. п/о300мг №20 (Байер РХ)","id":42640,"image":null},{"quantity":null,"price":null,"title":"Аспирин кардио таб. п/о100мг №28 (Байер РХ)","id":42638,"image":null}]

Дальше его делаю так

JSValue := TJSONObject.ParseJSONValue(JSText) as TJSONValue;
    if Assigned(JSValue) then
    begin 
...
И так далее.

Так вот JSValue не становится чем-то. Всегда nil.

Я пробовал программно оборачивать все в еще одни фигурные скобки ({}), результат тот же.

Изменено пользователем bssat
Ссылка на комментарий
  • 0

Вот так вот прекрасно работает все:

 

procedure TForm_Main.Button1Click(Sender: TObject);
// uses System.JSON;
var
  JSText: string;
  JSvalue: TJsonValue;
  JSarray: TJSONArray;
  JSobject: TJSONObject;
  I: integer;
begin
  try
    JSvalue := TJSONObject.ParseJSONValue(JSText); 
        if Assigned(JSvalue) then 
          begin 
             JSarray := JSvalue as TJSONArray;
             for I := 0 to JSarray.Count - 1 do
               begin
                  JSobject := JSarray.Items as TJSONObject;
                  ShowMessage(JSobject.GetValue('title').Value);
               end;
             end;
  finally
     Freeandnil(JSvalue);
  end;
end;
Изменено пользователем zairkz
Ссылка на комментарий

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

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

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

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

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

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

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

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

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

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