Sitemap

Flutter’da Json İşlemleri

4 min readJul 22, 2025

--

Press enter or click to view image in full size

Merhaba değerli okurlar. Bu yazımda sizlere Flutter’da Json İşlemlerinden bahsedeceğim.

JSON’u anlama süreci, özellikle yeni başlayanlar için Serialization, Deserialization, type ‘Null’ is not a subtype of type ‘String’ gibi korkutucu terimler ve hatalarla dolu olabilir. Bu yüzden bu yazıda konuyla ilgili aktarabileceğim tüm kavramları aktarmaya ve anlatmaya çalışacağım.

JSON Nedir?

Her şeyden önce, neden böyle bir şeye ihtiyacımız olduğunu netleştirelim.

JSON (JavaScript Object Notation), insanlar tarafından kolayca okunabilen ve makineler tarafından kolayca ayrıştırılabilen (parse edilebilen), metin tabanlı bir veri değişim formatıdır. İsmi JavaScript’ten gelse de, bugün tamamen dilden bağımsız bir standart haline gelmiştir.

Temelde iki yapıdan oluşur:

Nesneler (Objects): Süslü parantezler {} içinde yer alan, anahtar: değer (key: value) çiftlerinden oluşan koleksiyonlardır. Anahtarlar her zaman metin (String), değerler ise metin, sayı, boolean, başka bir nesne veya bir dizi olabilir.

{
"name": "Ahmet",
"isStudent": true,
"age": 25
}

Diziler (Arrays): Köşeli parantezler [] içinde yer alan, sıralı bir değerler listesidir.

[ "Flutter", "Dart", "Firebase" ]

Buraya kadar Json’u tanımış olduk.

Flutter tarafında en büyük zorluk bu Json formatını Dart dilinin anlayacağı hale getirmektir. İşte tamda burada iki kavram bizi karşılıyor.

Serialization ve Deserialization

  • Serialization (Serileştirme / Kodlama): Elimizdeki bir Dart nesnesini (örneğin bir User sınıfı örneğini) bir sunucuya göndermek için onu JSON formatında bir metne (String) dönüştürme işlemidir. Yani, Dart Nesnesi → JSON Metni.
  • Deserialization (Seri Dışılaştırma / Kod Çözme): Bir sunucudan gelen JSON formatındaki metni alıp, uygulamamızda kullanabileceğimiz bir Dart nesnesine dönüştürme işlemidir. Yani, JSON Metni → Dart Nesnesi.

Bu iki işlem, Flutter’da veri işlemenin temelini oluşturur.

Flutter’da JSON’u Dart nesnelerine dönüştürmek için temelde iki yaklaşım var diyebilirim.Bunu bir mobilya montajına benzetebiliriz.

  1. Manuel Yaklaşım (dart:convert): Mobilyayı tek tek vidaları sıkarak, her parçayı elinizle birleştirerek kurmaktır. Küçük işler için hızlıdır ve temel mantığı anlamanızı sağlar, ancak büyük bir gardırop kurmaya çalıştığınızda yorucu ve hataya açıktır.
  2. Otomatik Yaklaşım (Kod Üretimi): Mobilyayı, parçaların nereye gideceğini gösteren, hatta bazı vidaları sizin yerinize sıkan sihirli bir montaj robotuyla kurmaktır. Başlangıçta robotun kurulumu biraz zaman alır, ancak sonrasında işler inanılmaz derecede hızlanır ve hatasız olur.

Hadi bu iki yaklaşımı da bir User (Kullanıcı) modeli üzerinden görelim. API’den şöyle bir JSON geldiğini varsayalım:

{
"id": 1,
"name": "Leanne Graham",
"email": "Sincere@april.biz"
}

Manuel Deserialization (Kendin Yap Yöntemi)

Bu yöntemde Dart’ın dahili dart:convert kütüphanesini kullanacağız.

1. Model Sınıfını Oluştur:

class User {
final int id;
final String name;
final String email;

User({required this.id, required this.name, required this.email});

// 2. fromJson adında bir factory constructor'ı oluşturuyoruz.
// Bu, bir Map alıp bir User nesnesi döndürecek.
factory User.fromJson(Map<String, dynamic> json) {
return User(
id: json['id'], // JSON'daki 'id' anahtarını al
name: json['name'], // JSON'daki 'name' anahtarını al
email: json['email'], // JSON'daki 'email' anahtarını al
);
}
}

Kullanım

import 'dart:convert';

void main() {
String userJson = '''
{
"id": 1,
"name": "Leanne Graham",
"email": "Sincere@april.biz"
}
''';

// JSON metnini bir Map<String, dynamic> nesnesine dönüştür
Map<String, dynamic> userMap = jsonDecode(userJson);

// fromJson factory'sini kullanarak Map'i User nesnesine dönüştür
var user = User.fromJson(userMap);

print('Kullanıcı Adı: ${user.name}'); // Çıktı: Kullanıcı Adı: Leanne Graham
}

Şimdi bunları görünce e canım tamam işte manuelde olsa hallediyoruz otomatik falan koyup kafa karıştırmaya ne gerek var demeyin! Aşağıda bu manuel yapının eksikliklerine bakın

  • Yazım Hataları: Eğer json[‘email’] yerine json[‘Email’] yazarsanız, kod derlenir ama çalışma zamanında hata verir.
  • Boş Geçilebilirlik (Nullability): Eğer API’den email alanı gelmezse, uygulamanız çöker. Her alan için null kontrolü yapmanız gerekir.
  • Sıkıcı ve Tekrarlayıcı: Onlarca alana sahip karmaşık nesneler için bu işlemi yapmak tam bir angaryadır.

Otomatik Deserialization (json_serializable ile)

json_serializable gören ordinaryuslar hemen freezed diyerek oklarını fırlatacak ama onada değineceğim bir makale hazırlıyorum. Lütfen okları indirelim..

Bu işlemi otomatik yapmak için manuel olarak yapmamız gerekenler var.

Gerekli Paketleri Ekle:

dependencies:
flutter:
sdk: flutter
json_annotation: ^4.8.1 # Bu, normal dependencies altında

dev_dependencies:
flutter_test:
sdk: flutter
build_runner: ^2.4.6 # Bu ikisi, dev_dependencies altında
json_serializable: ^6.7.1

Sürümlere pub dev üzerinden bakmayı ihmal etmeyin lütfen.

Model Sınıfını Hazırla:
user.dart dosyamızı şimdi kod üretimi için hazırlayalım.

import 'package:json_annotation/json_annotation.dart';

// 1. Bu satır, derleyiciye bu dosyanın üretilecek bir 'part' dosyası olduğunu söyler.
part 'user.g.dart';

// 2. Sınıfımızı bu etiketle işaretliyoruz.
@JsonSerializable()
class User {
final int id;
final String name;
final String email;

User({required this.id, required this.name, required this.email});

// 3. Bu satırlar, kod üreticisinin bizim için dolduracağı metotlardır.
factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
Map<String, dynamic> toJson() => _$UserToJson(this);
}

Kodu Üret:
Projenizin terminalinde şu komutu çalıştırın:
flutter pub run build_runner build

Bu komut, projenizi tarayacak, @JsonSerializable etiketini bulacak ve user.g.dart adında bir dosya üretecektir. Bu dosyayı asla manuel olarak düzenlemeyin! İçi şuna benzer:

// user.g.dart (Üretilen Dosya - DOKUNMA!)
// ...
User _$UserFromJson(Map<String, dynamic> json) => User(
id: json['id'] as int,
name: json['name'] as String,
email: json['email'] as String,
);

Map<String, dynamic> _$UserToJson(User instance) => <String, dynamic>{
'id': instance.id,
'name': instance.name,
'email': instance.email,
};

Gördüğünüz gibi, manuel olarak yazdığımız kodun aynısını bizim için hatasız bir şekilde üretti!

Kullanımı, manuel yöntemle birebir aynıdır, ancak artık tip güvenliğiniz var! Eğer bir anahtar adını yanlış yazarsanız veya tipler uyuşmazsa, kodunuz derlenmeyecek veya build_runner hata verecektir.

Evet değerli arkadaşlar bu yazımda elimden geldiğince Json işlemlerine değindim. Bu konuya ek olarak daha profesyonel bir yaklaşımla Json Serialization ve Deserialization yapabileceğiniz freezed paketinden bahsedeceğim yazım için takipte kalın…

Umarım bu yazı ilgilisi ve meraklısı için faydalı olmuştur.

Sonraki yazılarda görüşmek üzere…

Github: www.github.com/abdullah017
Linkedin: www.linkedin.com/in/abdullahtas
Stackoverflow:
https://stackoverflow.com/users/13807726/abdullah-t

#FREEPALESTINA

--

--

AbdullahTaş
AbdullahTaş

Written by AbdullahTaş

Full Stack | Ai | Mobile Developer | Project Management | Software Team Lead |