Flutter JSON数据解析插件json_getter的使用

Flutter JSON数据解析插件json_getter的使用

JsonGetter

该插件是一个有用的Flutter工具,用于从JSON结构中提取值。

特性

  • 轻松地从JSON结构中提取值。
  • 支持多种过滤器以细化数据提取。

开始使用

要使用此插件,请确保已安装Flutter,并将其添加到你的pubspec.yaml文件中。

步骤 1: 添加插件

pubspec.yaml文件中添加插件:

dependencies:
  json_getter: ^0.0.1

步骤 2: 导入插件

在Dart文件中导入插件:

import 'package:json_getter/json_getter.dart';

使用方法

使用JSON字符串

const jsonString = '{"key1": "value1", "key2": "value2"}';
final filters = FiltersMapper.fromJson(
    '{"filters":[{"selectorType":"getValueByKey","filterBy":null,"key":"key1","operator":null,"value":null}]}',
);

final result = JsonGetter.get(filters: filters, json: jsonString);
print(result); // 输出: value1

使用JSON Map

const jsonString = {'key1': 'value1', 'key2': 'value2'};
final filters = Filters(
  filters: [
    const Filter(
      selectorType: SelectorType.getValueByKey,
      key: 'key1',
    ),
  ],
);

final result = JsonGetter.get(filters: filters, json: jsonString);
print(result); // 输出: value1

示例

完整示例代码

import 'package:flutter/material.dart';
import 'package:json_getter/json_getter.dart';

import 'data.mocks.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return const MaterialApp(
      title: 'Flutter JSON Getter Example',
      debugShowCheckedModeBanner: false,
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  ValueNotifier<List<Product>> productList = ValueNotifier([]);

  Future<void> _getProducts() async {
    productList.value = productJsonMock
        .map((json) => Product.fromJson(json, filters: filtersConfigMock))
        .toList();
  }

  [@override](/user/override)
  void initState() {
    super.initState();
    _getProducts();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: ValueListenableBuilder(
        valueListenable: productList,
        builder: (context, value, child) {
          return ListView.builder(
            itemCount: value.length,
            itemBuilder: (context, index) {
              return ProductCard(product: value[index]);
            },
          );
        },
      ),
    );
  }
}

class Product {
  Product({
    this.name,
    this.price,
    this.image,
    this.customFields,
  });

  factory Product.fromJson(
    Map<String, dynamic> json, {
    Map<String, Map<String, List<Map<String, String?>>>>? filters,
  }) {
    final name = json['name']?.toString();

    final price = json['price']?.toString();

    final images = json['images'];
    final image = (images is List<Map> && images.isNotEmpty)
        ? images[0]['src']?.toString()
        : null;

    final customFields = filters?.map(
      (key, filter) {
        return MapEntry(
          key,
          JsonGetter.get(
            filters: FiltersMapper.fromMap(filter),
            json: json,
          ),
        );
      },
    );

    return Product(
      name: name,
      price: price,
      image: image,
      customFields: customFields,
    );
  }

  final String? name;
  final String? image;
  final String? price;

  /// Custom fields from json_getter filters
  final Map<String, dynamic>? customFields;
}

class ProductCard extends StatelessWidget {
  const ProductCard({super.key, required this.product});

  final Product product;

  Widget _renderProductDetails(Product product) {
    return Column(
      crossAxisAlignment: CrossAxisAlignment.start,
      mainAxisSize: MainAxisSize.min,
      children: [
        if (product.name != null) Text(product.name!),
        if (product.price != null) Text('Price: \$${product.price}'),
        if (product.customFields?['categories']?.toString().isNotEmpty ?? false)
          Text(
            'Categories: ${product.customFields?['categories']}',
          ),
        if (product.customFields?['tags']?.toString().isNotEmpty ?? false)
          Text('Tags: ${product.customFields?['tags']}'),
      ],
    );
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    final screenSize = MediaQuery.sizeOf(context);
    final isLandscape =
        MediaQuery.of(context).orientation == Orientation.landscape;

    return Container(
      padding: const EdgeInsets.all(8.0),
      margin: const EdgeInsets.all(8.0),
      decoration: BoxDecoration(
        border: Border.all(),
        borderRadius: BorderRadius.circular(8.0),
      ),
      child: (screenSize.width > 720 || isLandscape)
          ? Row(
              spacing: 8,
              children: [
                if (product.image != null)
                  Flexible(child: Image.network(product.image!)),
                _renderProductDetails(product),
              ],
            )
          : Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                if (product.image != null) Image.network(product.image!),
                _renderProductDetails(product),
              ],
            ),
    );
  }
}

更多关于Flutter JSON数据解析插件json_getter的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter JSON数据解析插件json_getter的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是一个关于如何在Flutter项目中使用json_getter插件来解析JSON数据的示例。json_getter是一个用于简化JSON数据解析的Flutter插件,它允许你通过定义类和使用注解的方式直接映射JSON数据到Dart对象。

首先,确保你已经在pubspec.yaml文件中添加了json_getter依赖:

dependencies:
  flutter:
    sdk: flutter
  json_getter: ^x.y.z  # 请替换为最新版本号

然后,运行flutter pub get来安装依赖。

接下来,我们假设有一个简单的JSON数据,如下所示:

{
  "name": "John Doe",
  "age": 30,
  "email": "johndoe@example.com",
  "address": {
    "street": "123 Main St",
    "city": "Anytown",
    "country": "USA"
  }
}

我们将使用json_getter来解析这个JSON数据。

步骤 1: 定义数据模型

首先,我们定义两个Dart类来映射JSON数据:UserAddress

import 'package:json_getter/json_getter.dart';

part 'user.g.dart';

@jsonSerializable
class User {
  @jsonKey("name")
  String name;

  @jsonKey("age")
  int age;

  @jsonKey("email")
  String email;

  @jsonKey("address")
  Address address;

  // 自动生成 fromJson 和 toJson 方法
  factory User.fromJson(Map<String, dynamic> json) => _$UserFromJson(json);

  Map<String, dynamic> toJson() => _$UserToJson(this);
}

@jsonSerializable
class Address {
  @jsonKey("street")
  String street;

  @jsonKey("city")
  String city;

  @jsonKey("country")
  String country;

  // 自动生成 fromJson 和 toJson 方法
  factory Address.fromJson(Map<String, dynamic> json) => _$AddressFromJson(json);

  Map<String, dynamic> toJson() => _$AddressToJson(this);
}

注意:我们需要使用part 'user.g.dart';来指示生成的文件名,并且每个类上都需要使用@jsonSerializable注解。

步骤 2: 生成JSON序列化代码

在终端中运行以下命令来生成user.g.dart文件:

flutter pub run build_runner build --build-file=path/to/your/build.yaml

如果你没有build.yaml文件,可以简单地在项目根目录下创建一个,内容如下:

targets:
  $default:
    builders:
      json_getter:json_getter:
        generate_for:
          - "**/*.dart"

确保json_getter的生成器配置正确,然后再次运行生成命令。

步骤 3: 使用解析后的数据

现在,你可以使用生成的fromJsontoJson方法来解析和序列化JSON数据了。

import 'dart:convert';
import 'package:flutter/material.dart';
import 'user.dart'; // 导入生成的类

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('JSON Getter Example'),
        ),
        body: Center(
          child: FutureBuilder<User>(
            future: fetchUser(),
            builder: (context, snapshot) {
              if (snapshot.connectionState == ConnectionState.done) {
                if (snapshot.hasError) {
                  return Text('Error: ${snapshot.error}');
                }
                User user = snapshot.data!;
                return Column(
                  mainAxisAlignment: MainAxisAlignment.center,
                  children: <Widget>[
                    Text('Name: ${user.name}'),
                    Text('Age: ${user.age}'),
                    Text('Email: ${user.email}'),
                    Text('Address: ${user.address.street}, ${user.address.city}, ${user.address.country}'),
                  ],
                );
              } else {
                return CircularProgressIndicator();
              }
            },
          ),
        ),
      ),
    );
  }

  Future<User> fetchUser() async {
    String jsonString = '''
    {
      "name": "John Doe",
      "age": 30,
      "email": "johndoe@example.com",
      "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "country": "USA"
      }
    }
    ''';
    Map<String, dynamic> jsonMap = jsonDecode(jsonString);
    return User.fromJson(jsonMap);
  }
}

在这个示例中,我们创建了一个简单的Flutter应用,它使用FutureBuilder来异步获取并解析JSON数据,然后将解析后的数据显示在屏幕上。

希望这能帮助你理解如何在Flutter项目中使用json_getter插件来解析JSON数据。如果你有任何其他问题,请随时询问!

回到顶部