Delphi & JSON

Кто работает или работал с JSON? В более ранних версиях Delphi, нам приходилось парсить данные Json вручную или прибегать к чьим-то готовым решениям, например SuperObject. Это было не удобно и крайне не понятно как работает. Про парсинг вручную я и вовсе молчу.

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

Объяснять как работает парсер JSON в Delphi я не буду, об этом можно почитать в официальной справке Embarcadero (ссылка на wiki). Я расскажу о некоторых чертовски классных вещах и об одном стороннем инструменте, который упростит вам работу в 10 раз.

JSON и класс Delphi

Встроенный парсер JSON позволяет работать с классом как с JSON объектом напрямую. Не понятно? И правильно. Сейчас покажу.

Возьмём вот такой класс погоды:

  TWeatherData = class
  private
    FHumidity: Extended;
    FPressure: Extended;
    FTemp: Extended;
    FTemp_max: Extended;
    FTemp_min: Extended;
  public
    property humidity: Extended read FHumidity write FHumidity;
    property pressure: Extended read FPressure write FPressure;
    property temp: Extended read FTemp write FTemp;
    property temp_max: Extended read FTemp_max write FTemp_max;
    property temp_min: Extended read FTemp_min write FTemp_min;
    function ToJsonString: string;
    class function FromJsonString(AJsonString: string): TWeatherData;
  end;

Позже, я вам объясню, почему так не аккуратно он описан. Но сейчас главное заметить два метода ToJsonString и FromJsonString.
Эти методы, как уже видно из их названия, позволяют преобразовать данные класса в Json-формат и обратно. Как? – По строчке на каждый метод не зависимо от класса.

function TWeatherData.ToJsonString: string;
begin
  result := TJson.ObjectToJsonString(self);
end;

class function TWeatherData.FromJsonString(AJsonString: string): TWeatherData;
begin
  result := TJson.JsonToObject<TWeatherData>(AJsonString)
end;

Вот собственно и всё. Парсер Json сам используя RTTI всё сделает. На этом собственно и всё.

JsonToDelphiClass

Существует инструмент, позволяющий сгенерировать json-совместимый класс из любого json (не специальная структура, а данные). Например, у нас есть ответ от сайта в формате json:

{
    "coord": {
        "lon": -0.13,
        "lat": 51.51
    },
    "weather": [
        {
            "id": 300,
            "main": "Drizzle",
            "description": "light intensity drizzle",
            "icon": "09d"
        }
    ],
    "base": "stations",
    "main": {
        "temp": 280.32,
        "pressure": 1012,
        "humidity": 81,
        "temp_min": 279.15,
        "temp_max": 281.15
    },
    "visibility": 10000,
    "wind": {
        "speed": 4.1,
        "deg": 80
    },
    "clouds": {
        "all": 90
    },
    "dt": 1485789600,
    "sys": {
        "type": 1,
        "id": 5091,
        "message": 0.0103,
        "country": "GB",
        "sunrise": 1485762037,
        "sunset": 1485794875
    },
    "id": 2643743,
    "name": "London",
    "cod": 200
}

Мы открываем https://jsontodelphi.com и в главное поле вставляем скопированный ответ от сервера. Нажимаем “Generate”.

И получаем:

И получаем, полностью сформированную структуру данных указанного вами json-файла в лице Delphi класса (классов).

В дополнение

Метод FromJsonString является классовым и создаёт новый объект как конструктор. Для обновления уже созданного класса можно добавить и использовать метод:

procedure TWeather.ParseFromJson(AJsonObject: TJsonObject);
begin
  TJson.JsonToObject(Self, AJsonObject);
end;

Примером работы с json я прикреплю небольшую программку, которая показывает погоду выбранного вам города.


You may also like...