【问题标题】:Converting object to an encodable object failed将对象转换为可编码对象失败
【发布时间】:2018-09-20 01:26:49
【问题描述】:

我收到以下错误:

Converting object to an encodable object failed: Instance of 'Patient'
#0      _JsonStringifier.writeObject (dart:convert/json.dart:674)
#1      _JsonStringifier.writeList (dart:convert/json.dart:724)
#2      _JsonStringifier.writeJsonValue (dart:convert/json.dart:706)
#3      _JsonStringifier.writeObject (dart:convert/json.dart:664)
#4      _JsonStringStringifier.printOn (dart:convert/json.dart:873)
#5      _JsonStringStringifier.stringify (dart:convert/json.dart:855)
#6      JsonEncoder.convert (dart:convert/json.dart:256)
#7      JsonCodec.encode (dart:convert/json.dart:155)
#8      Persistence.saveLatestPatients (/Users/dean/Library/Developer/CoreSimulator/Devices/570CC18D-95BF-4062-8523-9C78E106D0CF/data/Containers/Data/Application/70CAEFAA-4AE3-4CBF-A85F-39161E472C83/tmp/flutter_prototypev6jYbr/flutter_prototype/lib/utils/persistence.dart:32:23)
<asynchronous suspension>
#9      _HomeScreenState.fetchData.<anonymous closure> (/Users/dean/Librar<…>

我的“病人”班级:

import 'package:simple_moment/simple_moment.dart';

class Patient {
  String guid;
  String _name;
  String _surname;
  DateTime _updated;

  Patient(String guid) {
    this.guid = guid;
  }

  String get name => _name;
  set name(v) => _name = v;

  String get surname => _surname;
  set surname(v) => _surname = v;

  DateTime get updated => _updated;
  set updated(v) => _updated = v;

  // Helper functions

  String getFullName() => '$_name $_surname';

  String getRelativeLastUpdated() {
    var moment = new Moment.now();
    return moment.from(_updated);
  }

}

【问题讨论】:

  • 在我的例子中,我使用 DIO 网络库直接将模型类对象作为请求参数传递。我只需要在调用 API 之前将其转换为 json。

标签: json serialization dart encode


【解决方案1】:

就我而言,

return file.writeAsString(jsonEncode(addNewScore(scorer, s)));

jsonEncode 抛出错误Converting object to an encodable object failed: _LinkedHashMap len:1

{ turnoff: { times: { 15: [ {score: 6, ts: 1640916433851}]}}} int

所以在将该属性从int 转换为String 后能够正确获取

{ "关闭": { "次": { "15": [{"score":6,"ts":1640916433851}]} } }

JSON 不允许整数键或属性

【讨论】:

    【解决方案2】:

    就我而言,我在形成 json 请求时添加了多个“{”大括号。拆下牙套后,效果很好。

    jsonEncode({
    {
      'isAnonymous': request.isAnonymous,
    }});
    

    【讨论】:

      【解决方案3】:

      我试图在 dio 请求参数的映射中使用 Uri。将其转换为字符串解决了这个问题。

      直接使用redirectUrl Uri 的实例时出错

      data: {
            'client_id': identifier,
            'client_secret': secret,
            'code': code,
            'redirect_uri': redirectUrl
          });
      

      转换为String后没有错误。

      data: {
            'client_id': identifier,
            'client_secret': secret,
            'code': code,
            'redirect_uri': redirectUrl.toString()
          });
          
      

      【讨论】:

        【解决方案4】:

        就我而言,我试图将 DateTime 直接添加到地图对象中。一旦我将它转换为字符串,错误就解决了。

        之前

        return {
          'birthDay', instance.birthDay
        };
        

        现在

        return {
           'birthDay', instance.birthDay?.toIso8601String(),
        };
        

        【讨论】:

          【解决方案5】:

          您不能只是将任意类实例转换为 JSON。

          一种选择是为 JsonEncoder() 构造函数提供一个自定义函数(通过toEncodable 参数)。这个自定义函数应该将您的自定义对象映射到 JsonEncoder 已经知道如何处理的类型(即数字、字符串、布尔值、null、列表和带有字符串键的映射)。

          https://api.dartlang.org/stable/1.24.3/dart-convert/JsonEncoder-class.html

          https://pub.dartlang.org/packages/json_serializable 是一个为此生成代码的包,因此您无需手动编写。

          另见https://flutter.io/json/

          【讨论】:

            【解决方案6】:

            您不需要添加任何库。您只需在对象中实现 fromJson 和 toJson 函数。

            例子:

            class LinkItem {
              final String name;
              final String url;
            
              LinkItem({this.name, this.url});
            
              LinkItem.fromJson(Map<String, dynamic> json)
                  : name = json['n'],
                    url = json['u'];
            
              Map<String, dynamic> toJson() {
                return {
                  'n': name,
                  'u': url,
                };
              }
            }
            

            然后就可以调用jsonEncode了:

            List<LinkItem> list = await getUserLinks();
            list.add(linkItem);    
            String json = jsonEncode(list);
            

            结果:

              [{"n":"Google","u":"https://www.google.com/"},{"n":"Test","u":"https://www.test.com/"},{"n":"etc","u":"etc"}]
            

            【讨论】:

            • 不知道为什么这有这么少的赞成票,太棒了!只需编写一个 toJson() 方法,一切正常。最受好评的回应根本没有帮助。
            • 拯救了我的一天,我的生命。非常感谢@live-love :)
            • 完美答案。
            【解决方案7】:

            就我而言,我试图在地图对象中使用整数键。 一旦我将它转换为字符串,错误就解决了。祝你好运。

            【讨论】:

            • 完全是这样,虽然是个傻XD
            猜你喜欢
            • 2021-11-04
            • 2020-08-21
            • 2023-04-09
            • 2021-07-02
            • 2021-05-19
            • 1970-01-01
            • 2020-12-31
            • 2021-05-05
            • 2022-01-21
            相关资源
            最近更新 更多