JSON Dart

JSON to Dart Converter (Free AI Tool)

Convert JSON to Dart classes with automatic fromJson and toJson methods for Flutter development. Generate type-safe, null-safe Dart models from REST API responses. Eliminate manual serialization code and catch type errors at compile time in your Flutter apps.

Data Format Converter
Tools
JSON Input
Ready to convert
JSON Output
Converted output will appear here

Hint: Select conversion type, paste your data, and get instant conversion. Supports JSON, YAML, XML, Excel, PDF, and more.

Client-side only

How It Works

  1. 1

    Paste JSON from Flutter HTTP Response

    Input your JSON from Flutter HTTP packages or REST API documentation. Works with response bodies from Firebase, GraphQL, or any JSON endpoint.

  2. 2

    AI Generates Dart Classes with Serialization

    The AI creates Dart classes with null-safe types, generates factory fromJson constructors, creates toJson methods, and handles nested objects with proper List type generics.

  3. 3

    Copy Flutter-Ready Models

    Receive Dart code following Flutter conventions with proper null safety, immutable fields (final), and JSON serialization. Ready to use with jsonDecode() and http package in your Flutter project.

JSON vs Dart: Type Safety Comparison

Feature JSON (Runtime) Dart (Compile-time)
Type Safety Runtime only Compile-time with null safety
Serialization Manual parsing Auto-generated fromJson/toJson
Null Handling null value Nullable types (Type?)
Lists JSON arrays List<Type> with generics
IDE Support No autocomplete Full IntelliSense in VS Code/Android Studio
Refactoring Error-prone Type-safe refactoring

Code Examples

Example 1: Simple API Response to Dart Model

JSON Input
{
  "id": 123,
  "name": "John Doe",
  "email": "[email protected]",
  "isActive": true,
  "lastLogin": null
}
Dart Output
class User {
  final int id;
  final String name;
  final String email;
  final bool isActive;
  final String? lastLogin;

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

  factory User.fromJson(Map<String, dynamic> json) => User(
    id: json['id'] as int,
    name: json['name'] as String,
    email: json['email'] as String,
    isActive: json['isActive'] as bool,
    lastLogin: json['lastLogin'] as String?,
  );

  Map<String, dynamic> toJson() => {
    'id': id,
    'name': name,
    'email': email,
    'isActive': isActive,
    'lastLogin': lastLogin,
  };
}

Key Changes:

JSON keys convert to Dart final fields with explicit types (int, String, bool). Null values (lastLogin) generate nullable types (String?) with optional constructor parameters. The fromJson factory constructor uses type casting (as int, as String) for safety. Required fields use the required keyword in the constructor. The toJson method creates a Map for serialization back to JSON. This pattern works seamlessly with jsonDecode() and jsonEncode() in Flutter HTTP requests.

Example 2: Nested Objects and Lists

JSON Input
{
  "userId": 456,
  "profile": {
    "age": 30,
    "city": "NYC"
  },
  "orders": [
    {"id": 1, "total": 99.99},
    {"id": 2, "total": 149.99}
  ]
}
Dart Output
class Profile {
  final int age;
  final String city;

  Profile({required this.age, required this.city});

  factory Profile.fromJson(Map<String, dynamic> json) => Profile(
    age: json['age'] as int,
    city: json['city'] as String,
  );

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

class Order {
  final int id;
  final double total;

  Order({required this.id, required this.total});

  factory Order.fromJson(Map<String, dynamic> json) => Order(
    id: json['id'] as int,
    total: (json['total'] as num).toDouble(),
  );

  Map<String, dynamic> toJson() => {'id': id, 'total': total};
}

class UserData {
  final int userId;
  final Profile profile;
  final List<Order> orders;

  UserData({
    required this.userId,
    required this.profile,
    required this.orders,
  });

  factory UserData.fromJson(Map<String, dynamic> json) => UserData(
    userId: json['userId'] as int,
    profile: Profile.fromJson(json['profile'] as Map<String, dynamic>),
    orders: (json['orders'] as List).map((e) => Order.fromJson(e as Map<String, dynamic>)).toList(),
  );
}

Key Changes:

Nested JSON objects generate separate Dart classes (Profile, Order) referenced by type. JSON arrays become List<Type> with proper generics. The fromJson constructor recursively calls nested class constructors (Profile.fromJson, Order.fromJson). Array deserialization uses .map() to convert each JSON element. Numbers are cast to double via (json['total'] as num).toDouble() for precision. This multi-class structure maintains type safety across the entire object graph, enabling IntelliSense and compile-time error detection in Flutter development.

Frequently Asked Questions

How does the converter handle null safety and optional fields?

The converter generates null-safe Dart code with nullable types (String?) for fields that can be null. Required fields use non-nullable types (String, int). The fromJson factory constructor handles null values safely. For Flutter 3.x+, the output follows sound null safety with proper ? and required keyword usage based on JSON sample analysis.

Is my JSON data stored during conversion?

No. All JSON to Dart conversion happens entirely client-side in your browser using JavaScript. Your API responses—whether user data, payment info, or proprietary schemas—never leave your machine. The tool works offline once loaded.

Can the converter handle nested objects and List types?

Yes. Nested JSON objects generate separate Dart classes with references. Arrays become List<Type> with proper generic typing. The fromJson/toJson methods recursively handle nested serialization. Complex nested structures with arrays of objects generate factory constructors that map each element. Review the output for deeply nested structures to ensure proper type inference.

Related Tools