programing

처리되지 않은 예외:InternalLinkedHashMap'은 '목록' 유형의 하위 유형이 아닙니다.

abcjava 2023. 3. 12. 10:19
반응형

처리되지 않은 예외: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'의 하위 유형이 아닙니다.

이유가 뭘까요?

이 문제가 발생할 수 있는 일반적인 방법은 다음과 같습니다.

  1. 응답이 다음과 같은 json 배열인 경우

    [
        {
          key1: value1,
          key2: value2,
          key3: value3,
        },
        {
          key1: value1,
          key2: value2,
          key3: value3,
        },
    
        .....
    ] 
    

    그런 다음 name 속성을 가진 객체에 캐스팅하지 않으면 를 사용할 수 없습니다.

    이렇게 캐스팅을 합니다.data = json.decode(response.body).cast<ObjectName>();

    ObjectName원하는 오브젝트(내장 또는 커스텀)를 사용할 수 있습니다.하지만 이름 속성이 있는지 확인합니다.

  2. 응답이 다음과 같은 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>;

변환해야 합니다.runtimeTypedata부터_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

이 방법은 효과가 있었습니다.

  1. 목록 데이터 생성
  2. 맵을 사용하여 JSON 파일을 디코딩합니다.
  3. 목록 개체 데이터를 사용하여 JSON 파일 이름을 가져옵니다.
  4. 인덱스와 리스트 오브젝트의 도움을 받아 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

반응형