처리되지 않은 예외:InternalLinkedHashMap' 은 '목록' 유형의 하위 유형이 아닙니다 .
서버에서 JSON 응답을 가져와 콘솔에 출력하려고 합니다.
Future<String> login() async {
var response = await http.get(
Uri.encodeFull("https://etrans.herokuapp.com/test/2"),
headers: {"Accept": "application/json"});
this.setState(() {
data = json.decode(response.body);
});
print(data[0].name);
return "Success!";
}
처리되지 않은 예외: 유형 '_InternalLinkedHashMap<String, dynamic>'은 유형 'List'의 하위 유형이 아닙니다.
이유가 뭘까요?
이 문제가 발생할 수 있는 일반적인 방법은 다음과 같습니다.
응답이 다음과 같은 json 배열인 경우
[ { key1: value1, key2: value2, key3: value3, }, { key1: value1, key2: value2, key3: value3, }, ..... ]
그런 다음 name 속성을 가진 객체에 캐스팅하지 않으면 를 사용할 수 없습니다.
이렇게 캐스팅을 합니다.
data = json.decode(response.body).cast<ObjectName>();
ObjectName
원하는 오브젝트(내장 또는 커스텀)를 사용할 수 있습니다.하지만 이름 속성이 있는지 확인합니다.응답이 다음과 같은 JSON 객체인 경우
{ dataKey: [ { key1: value1, key2: value2, key3: value3, } ] }
그리고나서
json.decode
목록이 아닌 맵을 반환합니다.Map<String, dynamic> map = json.decode(response.body); List<dynamic> data = map["dataKey"]; print(data[0]["name"]);
사용할 수 있습니다.new Map<String, dynamic>.from(snapshot.value);
가장 쉬운 방법(1차원):
Map<String, dynamic> data = new Map<String, dynamic>.from(json.decode(response.body));
print(data['name']);
의 예를 들려고 합니다.InternalLinkedHashMap
그건 불가능해요
시리얼화 및 역시리얼화해야 합니다.Map<String, dynamic>
.
InternalLinkedHashMap<String, dynamic> invalidMap;
final validMap =
json.decode(json.encode(invalidMap)) as Map<String, dynamic>;
변환해야 합니다.runtimeType
의data
부터_InternalLinkedHashMap
실제로List
.
한 가지 방법은List.from
.
final _data = List<dynamic>.from(
data.map<dynamic>(
(dynamic item) => item,
),
);
범용 필드에 대한 작업이 필요한 경우 해결 방법이 있습니다.
class DicData
{
int tot;
List<Map<String, dynamic>> fields;
DicData({
this.tot,
this.fields
});
factory DicData.fromJson(Map<String, dynamic> parsedJson) {
return DicData(
tot: parsedJson['tot'],
//The magic....
fields : parsedJson["fields"] = (parsedJson['fields'] as List)
?.map((e) => e == null ? null : Map<String, dynamic>.from(e))
?.toList()
);
}
}
retrofit.dart를 사용하여 주석이 달린 메서드에 잘못된 반환 유형을 선언하면 다음 오류가 발생할 수 있습니다.
@GET("/search")
Future<List<SearchResults>> getResults();
// wrong! search results contains a List but the actual type returned by that endpoint is SearchResults
대
@GET("/search")
Future<SearchResults> getResults();
// correct for this endpoint - SearchResults is a composite with field for the list of the actual results
이 방법은 효과가 있었습니다.
- 목록 데이터 생성
- 맵을 사용하여 JSON 파일을 디코딩합니다.
- 목록 개체 데이터를 사용하여 JSON 파일 이름을 가져옵니다.
- 인덱스와 리스트 오브젝트의 도움을 받아 JSON 파일에서 동적으로 아이템을 인쇄했습니다.
setState(){
Map<String, dynamic> map = json.decode(response.body);
Data = map["name"];
}
// for printing
Data[index]['name1'].toString(),
이 에러는 다양한 현상 장애에 따라 발생할 수 있습니다.
저 같은 경우에는요.EasyLocalization
키를 누르지만, 아래에 정의하지 않음asset/lang/en_US.json
파일.
Firebase Cloud를 사용하는 경우 동일한 문서를 사용하여 여러 데이터를 추가하려고 하지 마십시오.아이디
firestore.collection('user').document(UNIQUEID).setData(educandos[0].toJson()).
[ Internal Linked Hash Map ]<String, dynamic >에서 [Map]<String, double >로 변환하려면 다음과 같이 입력합니다.
Map<String,double>.from(json['rates'])
같은 에러가 발생했습니다.json_annotation
,json_serializable
,build_runner
에 콜을 걸었을 때 발생합니다.ClassName.fromJson()
클래스 속성을 가진 클래스의 메서드(예: 클래스 사용자에게 속성 클래스 주소가 있음).
솔루션으로서 생성된 것을 수정했습니다.*.g.dart
각 클래스의 파일, 변경Map<String, dynamic>)
로.Map<dynamic, dynamic>)
어느 곳에서나 그 방법 안에 깊은 전환이 있다_$*FromJson
유일한 문제는 파일을 재생성할 때마다 파일을 다시 변경해야 한다는 것입니다.
언급URL : https://stackoverflow.com/questions/55430061/unhandled-exception-internallinkedhashmapstring-dynamic-is-not-a-subtype-of
'programing' 카테고리의 다른 글
JSON 만드는 법특정 유형을 시리얼화할 때 ToString()을 호출하는 Net serializer? (0) | 2023.03.17 |
---|---|
PyMongo upsert가 "upsert는 bool의 인스턴스여야 합니다" 오류를 발생시킵니다. (0) | 2023.03.17 |
Gson을 사용하여 알 수 없는 필드를 사용하여 JSON을 디코딩하려면 어떻게 해야 합니까? (0) | 2023.03.12 |
ORA-00054: 리소스가 사용 중이고 NOWAIT가 지정되어 있거나 타임아웃이 만료되었습니다. (0) | 2023.03.12 |
Swift에서 JSON을 디코딩할 때 "데이터가 없어 데이터를 읽을 수 없습니다" 오류가 발생했습니다. (0) | 2023.03.12 |