Dart Json

JSON (JavaScript Object Notation) – ma’lumotlarni saqlash va uzatish uchun eng qulay, ommalashgan format turi hisoblanadi. Bu format turi birinchi JavaScript dasturlash tili uchun chiqarilgan bo’lgan va hozirgi kunga kelib barcha dasturlash tillarida qo’llaniladi. Undan avval esa XML formati juda ommalashgan edi, ammo keyinchalik u eskirdi va json formati uning o’rnini egalladi. Bunga sabab bu format turining tushunish va turli matn muharriri dasturlarida ko’rish hamda tahrirlash qulayligi bo’ldi.

Json formatida yozilgan ma’lumot quyidagicha ko’rinishga ega bo’ladi:

Json formatida turli xil ko’rinishdagi ma’lumot turlarini ham saqlab ketish uchun imkoniyat mavjud.

Avvalo, json bilan ishlash uchun bizga dart:convert paketining json formatiga oʻzgartiruvchi json.encode() funksiyasi va jsondan maʼlumotlarni qayta tiklaydigan json.decode() funksiyasi kerak boʻladi.

Bitta obyektni saqlash va tiklash

Aytaylik, bizda quyidagi Sayt sinfi bor:

class Sayt {
String nom;
int yaratilgan;
Sayt(this.nom, this.yaratilgan);

factory Sayt.fromJson(Map<String, Object?> jsonMap){
return Sayt(jsonMap["nom"] as String, jsonMap["yaratilgan"] as int);
}

Map toJson() => {"nom": nom, "yaratilgan": yaratilgan};
@override
toString() => "Nom: $nom \tYaratilgan: $yaratilgan";
}

Ma'lumotlarni saqlash uchun Sayt sinfi ikkita maydonni aniqlaydi: nom va yaratilgan. Oddiy konstruktorga qo'shimcha ravishda, Sayt sinfi Sayt.fromJson() lug'atini qabul qiluvchi konstruktorini aniqlaydi, bu yerda kalitlar satrlarni va qiymatlar ixtiyoriy obyektlarni ifodalaydi va Sayt sinfi obyektini yaratish uchun ushbu lug'at elementlaridan foydalanadi. Ya'ni, jsonMap lug'atida nom va yaratilgan kalitlari bilan ikkita element bo'lishini bilamiz. Sayt sinfi toJson() qarama-qarshi amalni bajaradigan usulni ham belgilaydi - Sayt sinfi obyektidan ikkita nom va yaratilgan maydonlari bilan Map lug'atini yaratadi.

Sayt sinfining bitta obyektini json fayliga saqlaymiz:

import 'dart:io';
import 'dart:convert';

void main() async {
Sayt uzbekdevs = Sayt("Uzbekdevs", 2022);
var encoded = json.encode(uzbekdevs);
File file = File("sayt.json");
await file.writeAsString(encoded);
print("Fayl ma'lumot yozildi");
}

class Sayt {
String nom;
int yaratilgan;
Sayt(this.nom, this.yaratilgan);

factory Sayt.fromJson(Map<String, Object?> jsonMap){
return Sayt(jsonMap["nom"] as String, jsonMap["yaratilgan"] as int);
}

Map toJson() => {"nom": nom, "yaratilgan": yaratilgan};
@override
toString() => "Nom: $nom \tYaratilgan: $yaratilgan";
}

Bu yerda, birinchi navbatda, json kodini olamiz:

var encoded = json.encode(uzbekdevs);

toJson() funksiyasi obyektdan osongina json ga aylantirilishi mumkin bo'lgan Map lug'atini olish json.encode() usulidan foydalanadi. Json kodi asosan satr bo'lgani uchun biz uni matn fayliga yozishimiz mumkin. Natijada, ma'lumotlar "sayt.json" fayliga yoziladi.

Endi fayldagi ma'lumotlarni Sayt sinfi obyektiga qayta o'qiymiz:

import 'dart:io';
import 'dart:convert';

void main() async {
File file = File("sayt.json");
final data = await file.readAsString();
final decoded = json.decode(data);
final Sayt uzbekdevs = Sayt.fromJson(decoded);
print(uzbekdevs);
}
>> Nom: Uzbekdevs Yaratilgan: 2022

Bu yerda biz fayldan ma'lumotlarni birinchi navbatda file.readAsString() usuli yordamida satrga o'qiymiz.

final data = await file.readAsString();

Keyin json formatidagi satrni Map obyektiga dekodlaymiz ya’ni shifrdan chiqaramiz:

final decoded = json.decode(data);

Nihoyat, Sayt.fromJson() konstruktoridan foydalanib, biz Sayt sinfi obyektini yaratamiz:

final Sayt uzbekdevs = Sayt.fromJson(decoded);

Mana shu yerda Sayt sinfi toString() metodi o’z vazifasini bajaradi va satr ko’rinishida obyektni ekranga chop etadi.

Obyektlar ro'yxatini saqlash va tiklash

Keling, vazifani murakkablashtiramiz. Aytaylik, biz obyektlar ro'yxatini saqlashimiz kerak:

import 'dart:io';
import 'dart:convert';

void main() async {
final saytlar = [Sayt("Uzbekdevs", 2022), Sayt("uzbekdeveloper", 2023), Sayt("robocontest", 2020)];
final encoded = json.encode(saytlar);
await File("saytlar.json").writeAsString(encoded);
print("Ma'lumotlar saqlandi");
}

Bu "saytlar.json" faylida uchta obyekt ro'yxatini saqlaydi. Natijada faylga quyidagi ma'lumotlar yoziladi:

[{"nom":"Uzbekdevs","yaratilgan":2022},{"nom":"uzbekdeveloper","yaratilgan":2023},{"nom":"robocontest","yaratilgan":2020}

Endi ma'lumotlarni qayta tiklaymiz:

import 'dart:io';
import 'dart:convert';

void main() async {
final data = await File("saytlar.json").readAsString();
final decoded = json.decode(data);
var saytlar = [];
for(final item in decoded){
final Sayt person = Sayt.fromJson(item);
saytlar.add(person);
}
for(final sayt in saytlar){
print(sayt);
}
}

Bu yerda biz avval fayldagi ma'lumotlarni satrga o'qiymiz:

final data = await File("saytlar.json").readAsString();
Keyin json satrini Map lug'atlar ro'yxatiga aylantiramiz:
final decoded = json.decode(data);

Ya'ni, decoded List ni ifodalaydi, uning har bir elementi Map lug'atini ifodalaydi. Va har bir bunday lug'atdan Sayt sinfi obyektini olishimiz kerak. Buning uchun biz dekodlangan ro'yxatni ko'rib chiqamiz, uning har bir elementi uchun Sayt sinfi obyektini yaratamiz, keyin uni saytlar ro'yxatiga qo'shamiz:

var saytlar = [];
for(final item in decoded){
final Sayt person = Sayt.fromJson(item);
saytlar.add(person);
}