programing

개체를 인코딩 가능한 개체로 변환하지 못했습니다.

padding 2023. 3. 29. 21:16
반응형

개체를 인코딩 가능한 개체로 변환하지 못했습니다.

다음의 에러가 표시됩니다.

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);
  }

}

라이브러리를 추가할 필요가 없습니다.오브젝트에 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"}]

임의의 클래스 인스턴스를 JSON으로 변환할 수는 없습니다.

Flutter가 반사를 지원하지 않기 때문입니다.따라서 플래터 어플리케이션의 어떤 다트 프로그램도 클래스 피쳐의 속성을 판별할 수 없습니다.따라서 Flutter에서는 임의의 오브젝트를 시리얼화할 수 없습니다.

하나의 옵션은 (를 통해) Json Encoder() 컨스트럭터에 커스텀 함수를 제공하는 것입니다.toEncodable인수).이 커스텀 함수는 커스텀오브젝트를 JsonEncoder가 이미 처리할 수 있는 유형(예: 숫자, 문자열, 부울, 늘, 리스트 및 문자열 키가 있는 맵)에 매핑해야 합니다.

여기서 리플렉터블 플러그인을 사용할 수 있습니다.

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

https://pub.dartlang.org/packages/json_serializable은 코드를 생성하는 패키지이므로 수동으로 작성할 필요가 없습니다.

https://flutter.io/json/ 도 참조해 주세요.

제 경우 맵 오브젝트에서 정수 키를 사용하려고 했습니다.String으로 변환하자 오류가 해결되었습니다.행운을 빌어요.

제 경우 Date Time을 맵오브젝트에 직접 추가하려고 했습니다.String으로 변환하자 오류가 해결되었습니다.

전에

return {
  'birthDay', instance.birthDay
};

지금이다

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

제가 쓰려고 했는데Uridio 요청 매개 변수의 맵에 넣습니다.String으로 변환하면 문제가 해결.

직접 사용 시 오류 발생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()
    });
    

저 같은 경우에는

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

jsonEncode에러를 던지고 있었다Converting object to an encodable object failed: _LinkedHashMap len:1

{ off : { times : { 15 : [ { score : 6, ts : 1640916433851) }} <--여기서 15는 실제로는int

그래서 그 재산을 환산한 후에int로.String정확하게 얻을 수 있다

{ "off": { "times": { "15": [{ "score":6,ts":1640916433851)}} }

JSON은 정수 키 또는 속성을 허용하지 않습니다.

MappedListItable <MyObject, int>를 부호화하려고 했기 때문에 이 문제가 발생했습니다.

개체를 인코딩 가능한 개체로 변환하지 못했습니다.Mapped List Itable <My Object, int> 인스턴스

그리고 json Encode는 특정 유형만 인코딩할 수 있다는 것을 기억했습니다(어디선가 빨간색으로...).따라서 MappedListItable <MyObject, int> 오브젝트에서 .toList를 호출하면 목록이 jsonEncode에 의해 부호화되기 때문에 문제가 해결되었습니다.

"JSON 변환은 맵, 목록, 문자열, 숫자, 부울 또는 늘에서만 작동합니다."

따라서, jsonEncode를 사용하려는 데이터 유형이 jsonEncode에서 지원되는지 확인하십시오.

제 경우 json 요청을 작성하면서 여러 개의 '{' 중괄호를 추가했습니다.교정기를 떼고 나서 잘 작동했어요.

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

변환을 수행해야 하는 클래스에 toJson()이라는 이름의 메서드를 추가합니다.으로 변환 논리를 넣고 논리를 사용합니다.this.propety_name여기서 예를 보겠습니다.String toJson() { return jsonEncode({}); }

언급URL : https://stackoverflow.com/questions/49753412/converting-object-to-an-encodable-object-failed

반응형