json_query 0.1.0 copy "json_query: ^0.1.0" to clipboard
json_query: ^0.1.0 copied to clipboard

Extract and map fields from deeply nested JSON into Dart models without manual traversal.

example/json_query_example.dart

// Run with: dart run example/json_query_example.dart
import 'package:json_query/json_query.dart';

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

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

  factory User.fromJson(Map<String, dynamic> json) => User(
        id: json['id'] as int,
        name: json['name'] as String,
        package: json['package'] as String,
      );

  @override
  String toString() => 'User(id: $id, name: $name, package: $package)';
}

void main() {
  // A realistically awkward, deeply nested API response.
  final response = {
    'status': true,
    'data': {
      'user': {
        'id': 123,
        'profile': {'name': 'Ebrahim', 'avatar': '...'},
        'subscription': {
          'package': {'name': 'Fiber', 'speed': 100},
        },
      },
      'users': [
        {'id': 1, 'profile': {'name': 'Alice'}},
        {'id': 2, 'profile': {'name': 'Bob'}},
      ],
    },
  };

  // 1. Grab a single value.
  final id = JsonQuery(response).get('.data.user.id');
  print('id: $id');

  // 2. Extract and rename a handful of fields into a flat map.
  final picked = JsonQuery(response).pick({
    'id': '.data.user.id',
    'name': '.data.user.profile.name',
    'package': '.data.user.subscription.package.name',
  });
  print('picked: $picked');

  // 3. Map straight into a Dart object.
  final user = JsonQuery(response).map<User>(
    {
      'id': '.data.user.id',
      'name': '.data.user.profile.name',
      'package': '.data.user.subscription.package.name',
    },
    User.fromJson,
  );
  print('user: $user');

  // 4. Map every element of a list at once.
  final names = JsonQuery(response).mapList<String>(
    '.data.users',
    {'id': '.id', 'name': '.profile.name'},
    (json) => '${json['id']}: ${json['name']}',
  );
  print('names: $names');

  // 5. Reuse a compiled query across many payloads (e.g. one per page of results).
  final query = JsonQuery.compile({
    'id': '.data.user.id',
    'name': '.data.user.profile.name',
    'package': '.data.user.subscription.package.name',
  });
  final userAgain = query.map<User>(response, User.fromJson);
  print('userAgain: $userAgain');

  // 6. A missing field resolves to null instead of throwing.
  print('missing field: ${JsonQuery(response).get('.data.user.nickname')}');
}
1
likes
160
points
83
downloads

Documentation

API reference

Publisher

unverified uploader

Weekly Downloads

Extract and map fields from deeply nested JSON into Dart models without manual traversal.

Repository (GitHub)
View/report issues

Topics

#json #parsing #serialization #mapping

License

MIT (license)

More

Packages that depend on json_query