You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何更新本地JSON文件数据?

解决Flutter本地JSON文件更新问题

首先明确:Flutter项目中assets目录下的JSON文件是只读的,无法直接修改。如果你的JSON文件放在assets里,必须先复制到应用的可写沙盒目录,之后才能修改。如果已经是存放在可写目录,直接读写即可。

步骤1:添加依赖

需要path_provider获取应用可写目录,在pubspec.yaml中添加:

dependencies:
  flutter:
    sdk: flutter
  path_provider: ^2.1.0

执行flutter pub get完成依赖安装。

步骤2:核心工具方法

获取可写目录路径

import 'dart:io';
import 'package:path_provider/path_provider.dart';
import 'dart:convert';
import 'package:flutter/services.dart';

Future<String> get _localPath async {
  final directory = await getApplicationDocumentsDirectory();
  return directory.path;
}

Future<File> get _localJsonFile async {
  final path = await _localPath;
  // 替换成你的JSON文件名,比如data.json
  return File('$path/data.json');
}

复制assets中的JSON到可写目录(仅首次启动执行)

如果原始JSON在assets目录(比如assets/data.json),先在pubspec.yaml中声明资产:

flutter:
  assets:
    - assets/data.json

然后添加复制方法:

Future<void> copyAssetToLocal() async {
  final localFile = await _localJsonFile;
  if (!await localFile.exists()) {
    final byteData = await rootBundle.load('assets/data.json');
    final buffer = byteData.buffer;
    await localFile.writeAsBytes(buffer.asUint8List(byteData.offsetInBytes, byteData.lengthInBytes));
  }
}

在APP启动时调用该方法,示例:

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await copyAssetToLocal();
  runApp(const MyApp());
}

步骤3:读取并修改JSON数据

读取JSON为Map结构

Future<Map<String, dynamic>> readJsonData() async {
  try {
    final file = await _localJsonFile;
    final contents = await file.readAsString();
    return jsonDecode(contents);
  } catch (e) {
    // 读取失败返回默认空结构
    return {"title": "", "lists": []};
  }
}

修改JSON数据(以更新lists中id为127的qty为例)

Future<void> updateJsonData() async {
  final jsonData = await readJsonData();
  
  // 定位目标条目并修改字段
  for (var item in jsonData['lists']) {
    if (item['id'] == '127') {
      item['qty'] = '150'; // 修改qty值
      item['rec_date'] = DateTime.now().toString(); // 更新修改时间
      break;
    }
  }
  
  // 也可以添加新条目到lists数组
  // jsonData['lists'].add({
  //   "id": "128",
  //   "faci_code": "20019",
  //   // 补充其他必填字段
  // });
  
  // 将修改后的数据写入文件
  final file = await _localJsonFile;
  await file.writeAsString(jsonEncode(jsonData));
}

额外建议:使用模型类(可选,更规范)

如果JSON结构固定,建议用json_serializable生成模型类,避免手动操作Map出错:

  1. 添加依赖:
dependencies:
  json_annotation: ^4.8.1
dev_dependencies:
  build_runner: ^2.4.4
  json_serializable: ^6.7.0
  1. 定义模型类:
import 'package:json_annotation/json_annotation.dart';

part 'data_model.g.dart';

@JsonSerializable()
class DataModel {
  final String title;
  final List<ListItem> lists;

  DataModel({required this.title, required this.lists});

  factory DataModel.fromJson(Map<String, dynamic> json) => _$DataModelFromJson(json);
  Map<String, dynamic> toJson() => _$DataModelToJson(this);
}

@JsonSerializable()
class ListItem {
  final String id;
  final String faci_code;
  final String qty;
  // 补充其他字段

  ListItem({required this.id, required this.faci_code, required this.qty, /* 其他字段 */});

  factory ListItem.fromJson(Map<String, dynamic> json) => _$ListItemFromJson(json);
  Map<String, dynamic> toJson() => _$ListItemToJson(this);
}
  1. 执行flutter pub run build_runner build生成序列化代码,之后即可通过模型类安全读写JSON数据。

内容的提问来源于stack exchange,提问作者vandet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 21:55:30