ToolDeck

JSON থেকে Dart

fromJson ও toJson সহ JSON থেকে Dart ক্লাস তৈরি করুন

একটি উদাহরণ চেষ্টা করুন
রুট ক্লাসের নাম:

JSON ইনপুট

Dart আউটপুট

স্থানীয়ভাবে চলে · গোপন তথ্য পেস্ট করা নিরাপদ
Dart ক্লাসগুলো এখানে দেখাবে…

JSON থেকে Dart রূপান্তর কী?

JSON থেকে Dart রূপান্তর একটি কাঁচা JSON অবজেক্ট নিয়ে টাইপড ফিল্ড, নামযুক্ত কনস্ট্রাক্টর, fromJson ফ্যাক্টরি এবং toJson মেথডসহ Dart ক্লাস ডেফিনিশন তৈরি করে। Flutter-এ Dart রানটাইম রিফ্লেকশন সমর্থন করে না (dart:mirrors নিষ্ক্রিয়), তাই স্পষ্ট ম্যাপিং কোড না লিখে JSON কে টাইপড অবজেক্টে রূপান্তর করা সম্ভব নয়। প্রতিটি REST API রেসপন্স, Firebase ডকুমেন্ট বা কনফিগ পেলোডের জন্য টাইপ সেফটি সহ ফিল্ড অ্যাক্সেস করতে একটি সংশ্লিষ্ট Dart মডেল ক্লাস প্রয়োজন।

JSON-এর জন্য একটি সাধারণ Dart মডেল ক্লাস প্রতিটি কী-এর জন্য final ফিল্ড, নামযুক্ত প্যারামিটারসহ একটি কনস্ট্রাক্টর (non-nullable ফিল্ডের জন্য required কীওয়ার্ড সহ), Map<String, dynamic> থেকে পড়া fromJson নামের একটি ফ্যাক্টরি কনস্ট্রাক্টর এবং Map<String, dynamic> রিটার্ন করা একটি toJson মেথড ঘোষণা করে। নেস্টেড JSON অবজেক্টগুলো পৃথক ক্লাস হয়। অ্যারেগুলো টাইপড List ফিল্ড হয়। Nullable JSON মানগুলো টাইপে ? প্রত্যয় সহ Dart-এর null-safety সিনট্যাক্স ব্যবহার করে।

এই মডেল ক্লাসগুলো হাতে লেখার মানে হলো প্রতিটি JSON কী পড়া, Dart টাইপ নির্ধারণ করা, প্রতিটি ফিল্ডের জন্য fromJson কাস্ট তৈরি করা (.map().toList() দিয়ে লিস্ট ম্যাপিং সহ), একটি toJson ম্যাপ লিটারেল তৈরি করা এবং প্রতিটি নেস্টেড অবজেক্টের জন্য এটি পুনরাবৃত্তি করা। ১২টি ফিল্ড ও ২টি নেস্টেড অবজেক্টসহ একটি JSON অবজেক্টের জন্য এর মানে হলো ৩টি ক্লাস, ৬টি ফ্যাক্টরি লাইন এবং ডজন ডজন কাস্ট এক্সপ্রেশন। একটি কনভার্টার একটিমাত্র পেস্ট থেকে মিলিসেকেন্ডে এই সব তৈরি করে।

কেন JSON থেকে Dart কনভার্টার ব্যবহার করবেন?

JSON থেকে Dart মডেল ক্লাস হাতে লেখার সময় ফিল্ড নাম পড়া, নমুনা মান থেকে টাইপ অনুমান করা, সঠিক null হ্যান্ডলিংসহ fromJson কাস্ট লেখা এবং নেস্টেড অবজেক্টের জন্য প্রক্রিয়াটি পুনরাবৃত্তি করতে হয়। API-এর আকার পরিবর্তিত হলে প্রতিটি ফিল্ড, কনস্ট্রাক্টর, fromJson এবং toJson আপডেট করতে হয়। একটি কনভার্টার সেই পুনরাবৃত্তিমূলক কাজ দূর করে।

তাৎক্ষণিক ক্লাস তৈরি
JSON পেস্ট করুন এবং এক সেকেন্ডেরও কম সময়ে কনস্ট্রাক্টর, fromJson ফ্যাক্টরি ও toJson মেথডসহ সম্পূর্ণ Dart ক্লাস পান। নেস্টেড অবজেক্ট ও লিস্ট স্বয়ংক্রিয়ভাবে শনাক্ত ও ম্যাপ হয়।
🔒
গোপনীয়তা-প্রথম প্রক্রিয়াকরণ
রূপান্তর সম্পূর্ণরূপে আপনার ব্রাউজারে JavaScript ব্যবহার করে চলে। আপনার JSON ডেটা কখনো আপনার মেশিন ছেড়ে যায় না। API কী, টোকেন ও প্রোডাকশন পেলোড সম্পূর্ণ ব্যক্তিগত থাকে।
📝
Null-safe আউটপুট
তৈরি ক্লাসগুলো Dart-এর সাউন্ড null safety ব্যবহার করে। Nullable JSON ফিল্ডগুলো ? সাফিক্স পায় এবং কনস্ট্রাক্টরে required কীওয়ার্ড এড়িয়ে যায়। Non-null ফিল্ডগুলো required হিসেবে চিহ্নিত হয়।
📦
ইনস্টল বা সাইনআপ ছাড়াই
পেজ খুলুন এবং JSON পেস্ট করুন। কোনো Dart SDK নেই, কোনো pub নির্ভরতা নেই, কোনো অ্যাকাউন্ট নেই। ব্রাউজারসহ যেকোনো ডিভাইসে কাজ করে।

JSON থেকে Dart ব্যবহারের ক্ষেত্র

Flutter অ্যাপ ডেভেলপমেন্ট
http বা dio প্যাকেজ দ্বারা ব্যবহৃত REST API রেসপন্সের জন্য মডেল ক্লাস তৈরি করুন। আপনার ব্যাকএন্ড যে JSON রিটার্ন করে তা পেস্ট করুন এবং jsonDecode ও উইজেট রেন্ডারিংয়ের জন্য প্রস্তুত Dart ক্লাস পান।
Firebase / Firestore ইন্টিগ্রেশন
Firestore ডকুমেন্ট স্ন্যাপশটের জন্য টাইপড মডেল ক্লাস তৈরি করুন। একটি নমুনা ডকুমেন্ট JSON হিসেবে পেস্ট করুন, Dart ক্লাস তৈরি করুন এবং আপনার রিপোজিটরি স্তরে snapshot.data() সহ fromJson ব্যবহার করুন।
স্টেট ম্যানেজমেন্ট মডেল
Riverpod, Bloc বা Provider-এর জন্য টাইপড স্টেট অবজেক্ট সংজ্ঞায়িত করুন। প্রত্যাশিত স্টেট আকার JSON হিসেবে পেস্ট করুন এবং স্টেট পার্সিস্টেন্স ও হাইড্রেশনের জন্য toJson সহ অপরিবর্তনীয় Dart ক্লাস পান।
API ক্লায়েন্ট কোড তৈরি
Retrofit বা Chopper API ক্লায়েন্টের জন্য রিকোয়েস্ট ও রেসপন্স মডেল তৈরি করুন। নমুনা JSON পেলোড পেস্ট করুন এবং আপনার OpenAPI রেসপন্স স্কিমার সাথে মিলে যাওয়া Dart ক্লাস পান।
স্বয়ংক্রিয় পরীক্ষা
প্রকৃত API রেসপন্স থেকে টাইপড টেস্ট ফিক্সচার তৈরি করুন। একটি JSON নমুনা পেস্ট করুন, মডেল ক্লাস তৈরি করুন এবং হাতে ফিক্সচার স্ট্রাক্ট না লিখে সরাসরি ইউনিট ও উইজেট পরীক্ষায় ব্যবহার করুন।
Dart প্যাটার্ন শেখা
Flutter শিক্ষার্থীরা যেকোনো JSON কাঠামো পেস্ট করতে এবং দেখতে পারে কীভাবে Dart এটি উপস্থাপন করে: final ফিল্ড, নামযুক্ত কনস্ট্রাক্টর, factory fromJson প্যাটার্ন এবং বাস্তবে null-safety অ্যানোটেশন।

JSON থেকে Dart টাইপ ম্যাপিং

প্রতিটি JSON মান একটি নির্দিষ্ট Dart টাইপে ম্যাপ হয়। নিচের সারণি দেখায় কনভার্টার প্রতিটি JSON টাইপ কীভাবে অনুবাদ করে। বিকল্প কলামে কম সাধারণ বা ম্যানুয়াল ম্যাপিং পরিস্থিতিতে ব্যবহৃত টাইপ দেখানো হয়েছে।

JSON টাইপউদাহরণDart টাইপবিকল্প
string"hello"StringString
number (integer)42intint
number (float)3.14doubledouble
booleantrueboolbool
nullnulldynamicNull / dynamic
object{"k": "v"}NestedClassMap<String, dynamic>
array of strings["a", "b"]List<String>List<String>
array of objects[{"id": 1}]List<Item>List<Item>
mixed array[1, "a"]List<dynamic>List<dynamic>

Dart JSON সিরিয়ালাইজেশন পদ্ধতি

Dart ও Flutter JSON সিরিয়ালাইজেশন পরিচালনার একাধিক উপায় প্রদান করে। ম্যানুয়াল fromJson/toJson সবচেয়ে সরল পদ্ধতি এবং কোনো কোড জেনারেশনের প্রয়োজন নেই। বড় প্রকল্পের জন্য, json_serializable ও freezed-এর মতো build_runner-ভিত্তিক সমাধান কম্পাইল সময়ে বয়লারপ্লেট তৈরি করে, ত্রুটি কমায় এবং মডেলগুলো JSON চুক্তির সাথে সামঞ্জস্যপূর্ণ রাখে।

পদ্ধতিবিবরণউৎস
json_serializableCode-generation-based JSON serialization. Generates .g.dart files at build time via build_runner. Type-safe and compile-time verified.Official (Google)
freezedGenerates immutable data classes with copyWith, fromJson/toJson, equality, and pattern matching support. Built on top of json_serializable.Community (rrousselGit)
built_valueGenerates immutable value types with serialization. Enforces immutability patterns. Used in larger codebases with strict data modeling.Google
dart_mappableAnnotation-based mapper that generates fromJson, toJson, copyWith, and equality. Simpler setup than freezed with similar features.Community
Manual fromJson/toJsonHand-written factory constructors and toJson methods. No code generation needed. Full control over the mapping logic.Built-in Dart

Manual বনাম json_serializable বনাম freezed

JSON মডেল ক্লাসের জন্য Dart-এ তিনটি সাধারণ পদ্ধতি আছে। ম্যানুয়াল fromJson/toJson-এর কোনো নির্ভরতা নেই। json_serializable ম্যাপিং কোড স্বয়ংক্রিয় করে। freezed json_serializable-এর উপরে অপরিবর্তনীয়তা, copyWith এবং প্যাটার্ন ম্যাচিং যোগ করে।

Manual fromJson/toJson
fromJson ফ্যাক্টরি ও toJson মেথড হাতে লিখুন। কোনো নির্ভরতা নেই, কোনো build_runner ধাপ নেই। কাস্টিং লজিক ও ত্রুটি হ্যান্ডলিংয়ের উপর সম্পূর্ণ নিয়ন্ত্রণ আপনার। কয়েকটি মডেলসহ ছোট প্রকল্পের জন্য বা কাস্টম ডিসিরিয়ালাইজেশনের প্রয়োজন হলে যা কোড জেনারেটর সমর্থন করে না। এটি এই টুলের আউটপুট ফরম্যাট।
json_serializable
আপনার ক্লাসে @JsonSerializable() অ্যানোটেট করুন এবং dart run build_runner build চালান। জেনারেটর _$ClassFromJson ও _$ClassToJson ফাংশনসহ একটি .g.dart ফাইল তৈরি করে। ফিল্ড পুনঃনামকরণ, ডিফল্ট মান ও কাস্টম কনভার্টারের জন্য @JsonKey পরিচালনা করে। মাঝারি থেকে বড় Flutter প্রকল্পের জন্য মানক পছন্দ।
freezed
@freezed দিয়ে অ্যানোটেট করুন এবং স্বয়ংক্রিয়ভাবে তৈরি fromJson, toJson, copyWith, সমতা (== ও hashCode) এবং toString সহ অপরিবর্তনীয় ক্লাস পান। sealed class প্যাটার্নের জন্য union টাইপ সমর্থন করে। dev dependencies হিসেবে freezed ও json_serializable উভয়ই প্রয়োজন। স্টেট ম্যানেজমেন্ট মডেল ও জটিল ডোমেইন অবজেক্টের জন্য সবচেয়ে উপযুক্ত।

কোড উদাহরণ

এই উদাহরণগুলো দেখায় কীভাবে JSON ডিসিরিয়ালাইজেশনের জন্য তৈরি Dart ক্লাস ব্যবহার করতে হয়, build_runner-এর সাথে json_serializable কীভাবে সেটআপ করতে হয় এবং JavaScript ও Python থেকে প্রোগ্রাম্যাটিক্যালি Dart ক্লাস কীভাবে তৈরি করতে হয়।

Dart (manual fromJson / toJson)
import 'dart:convert';

class User {
  final int id;
  final String name;
  final String email;
  final bool active;
  final Address address;
  final List<String> tags;

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

  factory User.fromJson(Map<String, dynamic> json) => User(
    id: json['id'] as int,
    name: json['name'] as String,
    email: json['email'] as String,
    active: json['active'] as bool,
    address: Address.fromJson(json['address'] as Map<String, dynamic>),
    tags: (json['tags'] as List<dynamic>).map((e) => e as String).toList(),
  );

  Map<String, dynamic> toJson() => {
    'id': id,
    'name': name,
    'email': email,
    'active': active,
    'address': address.toJson(),
    'tags': tags,
  };
}

class Address {
  final String street;
  final String city;
  final String zip;

  Address({required this.street, required this.city, required this.zip});

  factory Address.fromJson(Map<String, dynamic> json) => Address(
    street: json['street'] as String,
    city: json['city'] as String,
    zip: json['zip'] as String,
  );

  Map<String, dynamic> toJson() => {'street': street, 'city': city, 'zip': zip};
}

void main() {
  final jsonStr = '{"id":1,"name":"Alice","email":"alice@example.com","active":true,"address":{"street":"123 Main","city":"Springfield","zip":"12345"},"tags":["admin","user"]}';
  final user = User.fromJson(jsonDecode(jsonStr));
  print(user.name); // -> Alice
  print(jsonEncode(user.toJson())); // -> round-trip back to JSON
}
Dart (json_serializable + build_runner)
// pubspec.yaml dependencies:
//   json_annotation: ^4.8.0
//   dev_dependencies:
//     build_runner: ^2.4.0
//     json_serializable: ^6.7.0

import 'package:json_annotation/json_annotation.dart';
part 'user.g.dart'; // generated by: dart run build_runner build

@JsonSerializable()
class User {
  final int id;
  final String name;
  final String email;
  @JsonKey(name: 'is_active')
  final bool isActive;
  final List<String> tags;

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

  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);
  Map<String, dynamic> toJson() => _$UserToJson(this);
}

// Run code generation:
// dart run build_runner build --delete-conflicting-outputs
JavaScript (generate Dart classes from JSON)
function jsonToDart(obj, name = "Root") {
  const classes = [];
  function infer(val, fieldName) {
    if (val === null) return "dynamic";
    if (typeof val === "string") return "String";
    if (typeof val === "number") return Number.isInteger(val) ? "int" : "double";
    if (typeof val === "boolean") return "bool";
    if (Array.isArray(val)) {
      const first = val.find(v => v !== null);
      if (!first) return "List<dynamic>";
      return `List<${infer(first, fieldName)}>`;
    }
    if (typeof val === "object") {
      const cls = fieldName.charAt(0).toUpperCase() + fieldName.slice(1);
      build(val, cls);
      return cls;
    }
    return "dynamic";
  }
  function build(obj, cls) {
    const fields = Object.entries(obj).map(([k, v]) =>
      `  final ${infer(v, k)} ${k};`
    );
    classes.push(`class ${cls} {\n${fields.join("\n")}\n}`);
  }
  build(obj, name);
  return classes.join("\n\n");
}

console.log(jsonToDart({ id: 1, name: "Alice", scores: [98, 85] }, "User"));
// class User {
//   final int id;
//   final String name;
//   final List<int> scores;
// }
Python (generate Dart model from JSON)
import json

def json_to_dart(obj: dict, class_name: str = "Root") -> str:
    classes = []

    def infer(val, name):
        if val is None:
            return "dynamic"
        if isinstance(val, bool):
            return "bool"
        if isinstance(val, int):
            return "int"
        if isinstance(val, float):
            return "double"
        if isinstance(val, str):
            return "String"
        if isinstance(val, list):
            if not val:
                return "List<dynamic>"
            return f"List<{infer(val[0], name)}>"
        if isinstance(val, dict):
            cls = name[0].upper() + name[1:]
            build(val, cls)
            return cls
        return "dynamic"

    def build(obj, cls):
        fields = [f"  final {infer(v, k)} {k};" for k, v in obj.items()]
        classes.append(f"class {cls} {{\n" + "\n".join(fields) + "\n}")

    build(obj, class_name)
    return "\n\n".join(classes)

data = json.loads('{"id": 1, "name": "Alice", "active": true}')
print(json_to_dart(data, "User"))
# class User {
#   final int id;
#   final String name;
#   final bool active;
# }

প্রায়শই জিজ্ঞাসিত প্রশ্ন

Flutter কেন JSON ডিসিরিয়ালাইজেশনের জন্য dart:mirrors ব্যবহার করতে পারে না?
Flutter dart:mirrors (রিফ্লেকশন লাইব্রেরি) নিষ্ক্রিয় করে কারণ tree-shaking-এর জন্য কম্পাইল সময়ে জানা প্রয়োজন কোন কোড ব্যবহৃত হচ্ছে। রিফ্লেকশন কম্পাইলারকে অব্যবহৃত ক্লাস সরাতে বাধা দিত, অ্যাপের আকার বাড়িয়ে দিত। এই কারণে Flutter প্রকল্পগুলোর রানটাইম রিফ্লেকশনের পরিবর্তে স্পষ্ট fromJson/toJson মেথড বা কোড জেনারেশন প্রয়োজন।
json_serializable ব্যবহার করব নাকি fromJson হাতে লিখব?
১০-এর কম মডেল ক্লাসের প্রকল্পের জন্য, হাতে লেখা fromJson/toJson সহজ এবং কোনো বিল্ড নির্ভরতা যোগ করে না। ১০-এর বেশি মডেল থাকলে বা মডেলগুলো ঘন ঘন পরিবর্তিত হলে, json_serializable সময় বাঁচায় এবং copy-paste ত্রুটি কমায়। এটি অ্যানোটেশন থেকে ম্যাপিং কোড তৈরি করে, তাই ফিল্ড সংযোজনের জন্য শুধু build_runner পুনরায় চালাতে হয়।
কনভার্টার নেস্টেড JSON অবজেক্ট কীভাবে পরিচালনা করে?
প্রতিটি নেস্টেড JSON অবজেক্ট একটি পৃথক Dart ক্লাস হয়। যদি "address" নামের একটি JSON ফিল্ডে "street" ও "city" কীসহ একটি অবজেক্ট থাকে, কনভার্টার সেই ফিল্ড ও টাইপসহ একটি Address ক্লাস তৈরি করে এবং প্যারেন্ট ফিল্ডটি Address টাইপের হয়। fromJson ফ্যাক্টরি নেস্টেড ম্যাপ কাস্ট করে এবং Address.fromJson-এ পাঠায়।
JSON ফিল্ড null হলে কী হয়?
Null ফিল্ডগুলো ? প্রত্যয় সহ dynamic হিসেবে টাইপ করা হয় কারণ কনভার্টার শুধুমাত্র null মান থেকে উদ্দিষ্ট টাইপ নির্ধারণ করতে পারে না। আপনার API চুক্তি থেকে জানা হলে dynamic?-কে সঠিক টাইপ (String?, int? ইত্যাদি) দিয়ে প্রতিস্থাপন করুন। তারপর Dart-এর null safety কম্পাইল সময়ে সঠিক null চেক প্রয়োগ করবে।
বৈধ Dart শনাক্তকারী নয় এমন JSON কী কীভাবে পরিচালনা করব?
"first-name" বা "2nd_place" এর মতো JSON কী বৈধ Dart ফিল্ড নাম নয়। ম্যানুয়াল fromJson দিয়ে আপনি ফ্যাক্টরি কনস্ট্রাক্টরে যেকোনো JSON কীকে যেকোনো Dart ফিল্ড নামে ম্যাপ করতে পারেন। json_serializable দিয়ে ফিল্ডটি অ্যানোটেট করতে @JsonKey(name: 'first-name') ব্যবহার করুন। কনভার্টার স্বয়ংক্রিয়ভাবে কী নামগুলো camelCase Dart ফিল্ডে রূপান্তর করে।
এই টুলের আউটপুটের সাথে freezed ব্যবহার করা যাবে কি?
টুলটি ম্যানুয়াল fromJson/toJson সহ মানক Dart ক্লাস তৈরি করে। freezed-এ রূপান্তর করতে ক্লাসে @freezed অ্যানোটেশন ব্যবহার করুন, হাতে লেখা কনস্ট্রাক্টর ও ফ্যাক্টরি সরান এবং freezed mixin যোগ করুন। তারপর .freezed.dart ও .g.dart ফাইল তৈরি করতে build_runner চালান। তৈরি আউটপুটের ফিল্ড নাম ও টাইপগুলো সরাসরি স্থানান্তরিত হয়।
কাঁচা ম্যাপ ও JSON-এর জন্য টাইপড Dart ক্লাসের মধ্যে পার্থক্য কী?
একটি কাঁচা ম্যাপ (Map<String, dynamic>) আপনাকে কোনো টাইপ যাচাই ছাড়াই JSON ডেটায় সরাসরি অ্যাক্সেস দেয়। কল সাইটে প্রতিটি মান কাস্ট করতে হবে এবং কী নামে টাইপো রানটাইমে নীরবে ব্যর্থ হয়। একটি টাইপড Dart ক্লাস fromJson সীমানায় টাইপ অসামঞ্জস্য ধরে, ফিল্ড নামের জন্য IDE অটোকমপ্লিশন প্রদান করে এবং রিফ্যাক্টরিং নিরাপদ করে। কার্যক্ষমতার পার্থক্য নগণ্য; সুবিধাটি সম্পূর্ণরূপে নির্ভুলতা ও মেইনটেইনেবিলিটি সম্পর্কে।

সম্পর্কিত টুলস

JSON ফরম্যাটার ও বিউটিফায়ারসিনট্যাক্স হাইলাইটিং সহ JSON ফরম্যাট ও বিউটিফাই করুনJSON ভ্যালিডেটরJSON সিনট্যাক্স ও স্ট্রাকচার ভ্যালিডেট করুনJSON ডিফদুটি JSON অবজেক্ট তুলনা করুন ও পার্থক্য হাইলাইট করুনJSON প্রিটি প্রিন্টপাঠযোগ্যতার জন্য কাস্টমাইজযোগ্য ইন্ডেন্টেশন সহ JSON প্রিটি প্রিন্ট করুনJSON মিনিফায়ারহোয়াইটস্পেস সরিয়ে JSON মিনিফাই ও কম্প্যাক্ট করুনJSON থেকে YAML রূপান্তরকারীJSON কে YAML ফরম্যাটে রূপান্তর করুনJSON থেকে CSVJSON অ্যারেকে CSV ফরম্যাটে রূপান্তর করুনJSON থেকে TypeScriptJSON থেকে TypeScript ইন্টারফেস তৈরি করুনJSON থেকে C# ক্লাসJSON থেকে C# ক্লাস তৈরি করুনJSON থেকে Go StructJSON থেকে Go struct তৈরি করুনJSON থেকে PythonJSON থেকে Python dataclass তৈরি করুনJSON থেকে JavaJSON থেকে Java POJO ক্লাস তৈরি করুন