Кто работает или работал с
Сразу скажу, что пишу я для новичков, для меня json (и xml) был трудностью, о которой мало где писали. Сейчас в Delphi есть официальная поддержка формата JSON и это очень удобная хрень я вам скажу.
Объяснять как работает парсер
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 я прикреплю небольшую программку, которая показывает погоду выбранного вам города.