Flutter json解码_TypeError(类型'List <dynamic>'不是类型'Map <dynamic,dynamic>'的子类型)

时间:2020-02-14 16:22:01

标签: arrays json api flutter decode

所以这个错误我理解它的含义以及需要做什么,但是我不知道如何去做我想做的事情。

所以我正在使用html api服务器调用,它返回Map对象的jsonEncoded列表。

每个列表的大小都可以(并且会改变),所以我不能使用仅检查和解码前几个内容的功能。此外,每个Map对象可能包含不同的信息,因此我无法使其静态解析。我需要对整个列表进行jsonDecode,然后将其转换回单独的Map对象的列表,以便可以在程序的其余部分中使用Map对象中包含的信息。

出于隐私方面的原因,我无法提供我所接收的对象类型(或类似内容)的示例,对于由此给您带来的不便,并为尝试回答该问题增加了难度,我深表歉意。

也就是说,我确实知道我只需要一个函数来检查列表中有多少个对象,将response.body分成那么多片段,将每个片段解码为Map对象,然后将其添加到列表中,或数组。

您可以提供的任何信息(即使不是特定的代码)也将有所帮助,即使只是告诉我应该查看哪些命令。 (最好使用其语法示例,但当然不是强制性的。)

如果您需要我可以提供的任何信息,我们将很乐意提供。预先谢谢你。

1 个答案:

答案 0 :(得分:1)

您的问题是,我们甚至都不知道您输入数据的一般结构。作为一个社区,我们不需要知道一个实际的例子。甚至伪造的数据也足够。

话虽如此,我将尝试为您提供一些示例,说明您的传入数据可能是什么,以及您如何做自己想做的事情。

传入的JSON对象

可以说您的传入数据如下:

{
  "data1": {
    "subdata1":"subvalue1",
    "subdata2":"subvalue2",
    "subdata3":3,
    "subdata4":{
      "subsubdata1":"subvalue1"
    }
  },
  "data2": {
    "subdata1":"subvalue1",
    "subdata2":"subvalue2",
    "subdata3":3,
    "subdata4":{
      "subsubdata1":"subvalue1"
    }
  }
}

在这种情况下,您可以使用jsonDecode,并且仍然能够计算键并返回相关的对象列表,如下所示:

void consumeResponse(http.Response response) {
  // decode the entire response string
  final Map<String, dynamic> rawObject = jsonDecode(response.body);

  // count the records in the response
  final int recordCount = rawObject.keys.length;

  // create an array of the data in each top level object key (but you lose the top level key name)
  final List<dynamic> records = List<dynamic>.from(rawObject.values);
}

传入的JSON对象数组

让我们说您的json实际上已经在json数组中了,并且您的响应如下所示:

[
  {
    "data1": {
      "subdata1":"subvalue1",
      "subdata2":"subvalue2",
      "subdata3":3,
      "subdata4":{
        "subsubdata1":"subvalue1"
      }
    }
  },
  {
    "data2": {
      "subdata1":"subvalue1",
      "subdata2":"subvalue2",
      "subdata3":3,
      "subdata4":{
        "subsubdata1":"subvalue1"
      }
    }
  }
] 

然后您可以使用此功能完成相同的事情:

void consumeResponse(http.Response response) {
  // decode the entire response string. this will auto-magically produce a List<dynamic>
  final List<dynamic> records = jsonDecode(response.body);

  // count the records in the response
  final int recordCount = records.length;
}

带有数据子列表的传入JSON对象

在某些情况下,您可能在包装的json对象中嵌入了一个结果列表,该对象还包含有关查询的一些其他元数据。在这种情况下,您的数据可能如下所示:

{
  "meta": {
    "limit": 2,
    "offset": 1,
    "total": 47
  },
  "results": [
    {
      "data1": {   
        "subdata1":"subvalue1",
        "subdata2":"subvalue2",
        "subdata3":3,
        "subdata4":{
          "subsubdata1":"subvalue1"
        }
      }
    },
    {
      "data2": {
        "subdata1":"subvalue1",
        "subdata2":"subvalue2",
        "subdata3":3,
        "subdata4":{
          "subsubdata1":"subvalue1"
        }
      }
    }
  ] 
} 

在这种情况下,您可能希望在键results中的子列表上运行相同的功能。您也可以使用类似的功能来做到这一点:

void consumeResponse(http.Response response) {
  // decode the entire response string
  final Map<String, dynamic> rawObject = jsonDecode(response.body);

  // create the List<dynamic> from the results list in the sub object
  final List<dynamic> records = rawObject['results'];

  // count the records in the response
  final int recordCount = records.length;
}

结束

希望,即使您的问题很模糊,也可以使用其中至少一种情况。如果可以,最好创建一些可以共享的“模拟数据”和/或“模拟代码”。该社区使用所有可用数据来构建他们的答案。您提供给我们的数据越多,您得到的答案就越好。