json_query 0.1.0
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')}');
}