1. ホーム
  2. json

[解決済み] 未処理の例外です。InternalLinkedHashMap<String, dynamic>' は 'List<dynamic>' 型のサブタイプではありません。

2023-01-28 05:45:28

質問

サーバーから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' タイプのサブタイプではありません。 not a subtype of type 'List

理由は何でしょうか?

どのように解決するのですか?

ここでは、よくある2つの方法を紹介します。

  1. 応答が以下のようなjson配列の場合

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

    次に data[0]["name"] ではなく data[0].name name プロパティを持つオブジェクトにキャストしない限りは data[0].name

    このようにキャストします。 data = json.decode(response.body).cast<ObjectName>();

    ObjectName は好きなオブジェクト(内蔵またはカスタム)を指定できます。ただし、name プロパティを持つことを確認してください。

  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"]);