Трудно обрабатывать JSON в delphi

В настоящее время я работаю над приложением, которое будет получать данные о вашем персонаже из арсенала WoW. Пример персонажа: Мой персонаж WoW(ссылка)

Я получу всю необходимую мне информацию, вызвав API, предоставленный Blizzard, и получу ответ в JSON. Пример JSON: Ответ JSON для указанного выше персонажа(ссылка)< /а>

Сначала я попытался получить данные из JSON с помощью строковых манипуляций. Это означает, что я разбиваю свои строки, ищу ключевые слова в строке, чтобы найти позицию и форматировать ее в отдельные фрагменты данных, такие как таланты и статистика.

Это прекрасно работало в начале, но поскольку я хотел больше данных, это стало сложнее из-за множества функций, которые я запускал на всех строках, это просто стало одним большим размытием и неясно, что я делал в тот момент.

Есть ли хороший способ обработать мой JSON? Я думал о том, чтобы получить JSON и создать пустой класс. При работе с JSON он будет генерировать свойства и сохранять там значения. Но я понятия не имею, возможно ли и как динамически генерировать свойства.

В будущем я хотел бы получить еще больше данных, но сначала я хочу запустить это, прежде чем даже думать об этом.

У кого-нибудь есть идеи/советы по этому поводу?

Заранее спасибо.


person Teun Pronk    schedule 17.12.2012    source источник
comment
См. библиотеку Delphi JSON для XE2, доступную для сериализации объектов, для различных библиотек Delphi для синтаксического анализа json.   -  person LU RD    schedule 17.12.2012
comment
Я думаю, вы могли бы попробовать TJSONObject или библиотеки например, SuperObject.   -  person TLama    schedule 17.12.2012
comment
Спасибо, рассмотрю оба варианта   -  person Teun Pronk    schedule 17.12.2012
comment
Я чувствую себя полным нубом, ха-ха, я нашел SuperObject ранее и просмотрел демо, пытался работать с ним, но не мог понять. Я новичок в delphi, начал работать с ним только с 01.10.2012, так что. Я связался с разработчиком SuperObject, все еще ожидая ответа. :)   -  person Teun Pronk    schedule 17.12.2012
comment
@Teun забудь об этом. Анри обычно очень занят своим самым последним проектом и забрасывает законченные. Кроме того, если он хотел объяснить основы более подробно, он не стал бы обсуждать это в личной почте, а создал бы и опубликовал более подробную документацию для всех. Так что вам, вероятно, лучше пойти в Google и поискать, как сделать то и это с помощью SuperObject, а не думать, что Хенруи объяснит это лично вам. Вы также можете попробовать другие библиотеки, такие как Synopse, чей форум обычно более активен, чем у Генри.   -  person Arioch 'The    schedule 17.12.2012
comment
@Arioch'The Хорошо, спасибо. Немного погуглил, увидев ответ, опубликованный ain. Похоже, я могу сделать это с помощью функций, предоставляемых delphi, см. ссылку но еще раз спасибо.   -  person Teun Pronk    schedule 17.12.2012
comment
@Teun laso, пожалуйста, прочтите: catb.org/esr/faqs/smart-questions. html Если вам нужны ответы, вопросы должны быть узкими и конкретными. В шаблоне я хочу сделать это. Я попробовал библиотеку, которая. Я сделал свой код таким. И ведет себя неправильно и в том, и в сем. помогите мне исправить мой код Чем более расплывчатый вопрос вы публикуете, тем меньше шансов, что кто-либо даст вам что-либо, кроме самых расплывчатых ответов.   -  person Arioch 'The    schedule 17.12.2012
comment
На самом деле ваш Havek кажется очень простым JSON. Почему ты не можешь это прочитать? в то время как ТАК помощь очень скудна - я не могу найти то, что вы там потеряли? В разделе «Синтаксический анализ структуры данных JSON» показано, как загрузить строку/файл json в другую библиотеку. Тогда как прочитать значение свойства объекта? показывает вам, как читать такие свойства, как имя и тому подобное. D:/DelphiProjects/Libs/SuperObject/readme.html Если вы проиграли на каком-то определенном действии - то спросите лучше об этом действии.   -  person Arioch 'The    schedule 17.12.2012
comment
Если у вас Delphi уровня Enterprise - то, наверное, так и есть. Но я думаю, что DB-Express слишком тяжелая платформа, чтобы иметь ненужную зависимость и использовать ее для быстрого синтаксического анализа. Но это ваш выбор конечно.   -  person Arioch 'The    schedule 17.12.2012
comment
@Arioch'The Вы решили здесь всю мою проблему, это была всего лишь одна из тех вещей, которые связаны с RTFM ... Если бы вы могли поставить это как ответ на этот вопрос, я могу принять это, поскольку это на самом деле решение проблемы. Еще раз спасибо :)   -  person Teun Pronk    schedule 17.12.2012
comment
@Teun, ты имеешь в виду ссылки на файл справки SuperObject? Я почти ничего не делал, кроме этого.   -  person Arioch 'The    schedule 17.12.2012
comment
Я новичок в Delphi, начал работать с ним только с 01-10-2012, поэтому 1) могу ли я попросить воздержаться от этого формата даты на международных сайтах? спасибо США, это немного двусмысленно, если вы имели в виду 01-10-2012 или 10-01-2012 // 2) вы никогда раньше не работали с hdelphi? если да, то зачем ты это начал? это общее мнение, что ниша delphi сокращается, и новая кровь не поступает, поэтому интересно узнать о противоположных примерах.   -  person Arioch 'The    schedule 20.12.2012
comment
Я начал работать с deplhi примерно 1 октября. До этого я никогда не работал с Delphi. Я начал работать с ним для своей работы. Я работал с VB+ASP.NET в течение года, но мой босс не дал мне новый контракт. Мне нужна была новая работа, и я нашел ее в компании, которая работает с Delphi. Вот поэтому я и начал :)   -  person Teun Pronk    schedule 20.12.2012
comment
PS. После того, как Embarcadero украла его оболочку GDI+, Генри заявил, что больше никогда не будет делать что-либо для Delphi. Жалость...   -  person Arioch 'The    schedule 10.01.2013


Ответы (3)


Ваш JSON кажется довольно коротким и простым. Кажется, вам не нужна особая скорость или экзотические функции. http://jsonviewer.stack.hu/#http://eu.battle.net/api/wow/character/moonglade/Xaveak?fields=stats,talents

И хотя начиная с Delphi XE2 у вас действительно есть стандартный синтаксический анализатор JSON как часть пакета DB-Express, все же есть проблемы:
1. Было сказано, что это вызовет проблемы как со скоростью, так и с надежностью.
2. Это заставит вас программа, зависящая от пакета DB-Express (почему, если вы на самом деле не используете его для доступа к БД?) 3. Это свяжет ваше будущее с редакцией Delphi Enterprise.

Так что вам лучше попробовать какую-нибудь стороннюю библиотеку.

Одним из самых быстрых, вероятно, будет парсер Synopse JSON, побочный проект их библиотека mORMot. В целом это хороший код, с большим вниманием к скорости и активной помощью разработчиков на их форуме.

Еще одной известной и используемой библиотекой будет SuperObject Анри Гурвеста. Он утверждал, что является самым быстрым синтаксическим анализатором для Delphi, и хотя из-за вышесказанного это, вероятно, не вернее, скорость вполне адекватная для большинства задач. Сам Анри не поддерживает активно свои бывшие проекты, всегда делает что-то новое, поэтому скудная документация (также продублировано в установочном пакете) будет все, что у вас есть официально, плюс есть форум, где другие пользователи могут вам помочь. OTOH, основная идея дизайна SuperObject заключалась в единообразии, и хотя некоторые задачи действительно можно было бы лучше задокументировать - это в основном из-за неопределенности «действительно ли эта задача будет работать в однородной материи без какой-либо специальной обработки». Но обычно это так.
PS. Поскольку это вики, вы можете попытаться улучшить ее для будущих пользователей ;-)

Итак, возвращаясь к документации, вам понадобится

1) чтобы загрузить весь JSON в библиотеку. Это вы можете сделать, создав TStream с помощью вашей http-библиотеки или предоставив строковый буфер с данными: это раздел Разбор структуры данных JSON в руководство

2) чтение таких значений, как "имя" и "уровень" - описано в разделе Как прочитать значение свойства объекта?.

3) задействовать массивы, такие как "таланты" - описано в разделе Просмотр структуры данных.

person Arioch 'The    schedule 17.12.2012
comment
Спасибо за это, теперь я знаю, что это маленький JSON. Но посмотрите, что вы можете добавить, и большую часть этого я добавлю ссылка Может стать довольно большой ;) - person Teun Pronk; 18.12.2012
comment
Вы не ошибетесь, если будете использовать компоненты и библиотеки Synapse. Их поддержка и преданность вне этого мира. - person Leonardo Herrera; 23.06.2015
comment
@LeonardoHerrera synOpse, а не synApse - два совершенно разных дома и библиотеки - person Arioch 'The; 24.06.2015
comment
@ Arioch'The - да, вы совершенно правы, это была опечатка. Я имел в виду проектную мысль Арно (mormot/Synopse.) - person Leonardo Herrera; 24.06.2015

XE3 имеет "встроенную" поддержку JSON (см. docwiki), но я слышал (сам не использовал), что он не очень хорошо оптимизирован. Так что, возможно, поищите какой-нибудь сторонний вариант, например SuperObject.

person ain    schedule 17.12.2012

Ваша задача легко решается с помощью TSvSerializer, который включен в мой delphi-oop. Вам нужно только объявить тип вашей модели и десериализовать его из строки json. Ваша модель (очень упрощенная неполная и непроверенная версия) должна выглядеть примерно так:

type
  TStats = class
  public
    property health: Integer read fhealth write Fhealth;
    ... 
  end;

  TTalent = class
  public
    property tier: Integer read Ftier write Ftier;
    ...
  end;

  TMainTalent = class
  public
    property selected: Boolean read Fselected write Fselected;
    property talents: TObjectList<TTalent> read Ftalents write Ftalents;
  end;

  TWowCharacter = class
  public
    property lastModified: Int64 read FlastModified write FlastModified;
    property name: string read Fname write Fname;
    ...
    property stats: TStats read Fstats write Fstats;
    property talents: TObjectList<TMainTalent> read Ftalents write Ftalents;
    ...
  end;

Тогда вам просто нужно сделать:

uses
  SvSerializer;

var
  LWowCharacter: TWowCharacter;
begin
  LWowCharacter := TWowCharacter.FromJson(YourJsonString);
...

Вы можете найти мой контактный адрес электронной почты в проекте delphi-oop, спросите меня, если что-то неясно, я постараюсь помочь вам в свободное время.

person Linas    schedule 17.12.2012