在共享首选项中解码存储的 json 结果字符串

Posted

技术标签:

【中文标题】在共享首选项中解码存储的 json 结果字符串【英文标题】:decode stored json result string in shared preferences 【发布时间】:2021-12-16 18:25:44 【问题描述】:

当应用程序启动时,它会触发 API 调用,在我的情况下,我想存储响应数据以供以后使用,因此我为此使用了共享首选项并将响应数据存储为字符串。现在我想从共享首选项中存储的字符串中正确解码要使用的数据。

这是我如何将数据转换为字符串,

SharedPreferences prefs = await SharedPreferences.getInstance();

Response response = await _dio.post(
        _baseUrl,
        data: "index": indexNum, "password": password,
        options: Options(contentType: Headers.formUrlEncodedContentType),
      );

      if (response.statusCode == 200) 
        var result = response.data;
        
        //convert result data to string
        var resultData = Result.encode(result);
        
        // store the resultData in shared_preferences
        prefs.setString('results', resultData);
        
      

编码方法,

class Result 
  Result(
    required this.table,
    required this.data,
  );

  String table;
  List<Data> data;

  factory Result.fromJson(Map<String, dynamic> json) => Result(
        table: json["table"],
        data: List<Data>.from(json["data"].map((x) => Data.fromJson(x))),
      );

  //encode method
  static String encode(List<dynamic> results) => json.encode(
        results.map((result) => result.toString()).toList(),
      );
      

这是我从字符串中解码数据的方法,

  getData() async 
  
    SharedPreferences prefs = await SharedPreferences.getInstance();
    
    String? resultData = prefs.getString('results');
    
    List<dynamic> decodedJson = jsonDecode(resultData!);
    
    print(decodedJson);
 
  

结果数据字符串,

解码后的结果数据字符串,

我是 Flutter 的新手,我想要的是从模型中解码这些数据的正确方法。以下是我的模型类。

import 'dart:convert';

class Result 
  Result(
    required this.table,
    required this.data,
  );

  String table;
  List<Data> data;

  factory Result.fromJson(Map<String, dynamic> json) => Result(
        table: json["table"],
        data: List<Data>.from(json["data"].map((x) => Data.fromJson(x))),
      );

  static String encode(List<dynamic> results) => json.encode(
        results.map((result) => result.toString()).toList(),
      );


class Data 
  Data(
    required this.subjectName,
    required this.year,
    required this.credits,
    required this.sOrder,
    required this.result,
    required this.onlineAssignmentResult,
  );

  String subjectName;
  String year;
  String credits;
  String sOrder;
  String result;
  String onlineAssignmentResult;

  factory Data.fromJson(json) => Data(
        subjectName: json["subject_name"],
        year: json["year"],
        credits: json["credits"],
        sOrder: json["s_order"],
        result: json["result"],
        onlineAssignmentResult: json["online_assignment_result"],
      );

感谢您的时间和帮助。

【问题讨论】:

【参考方案1】:

您的 JSON 语法错误,Flutter 无法使用 jsonDecode() 进行解码

所有字符串和变量名都需要用"或'括起来

即subject_name: 应该是 "subject_name":

【讨论】:

以上是关于在共享首选项中解码存储的 json 结果字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何保存和获取存储在共享首选项中的包名称?

添加值后增加共享首选项键

我的共享首选项存储列表视图的数据并检索它不起作用

如何将字符串从共享首选项转换为 MutableList<LatLng> 对以在 kotlin 中绘制折线?

将 JWT 令牌存储在共享首选项中?并在整个应用程序中检索价值?

Flutter:使用共享首选项插件存储保存的收藏列表