JSON仅解析为动态类型,而不是Map

时间:2019-04-16 00:38:05

标签: json dart flutter

我希望有人可以在扑朔迷离地解析JSON时向我解释一些奇怪的行为。

这是我的JSON字符串:

{
    "Members": {
        "Member": [
            {
                "Member_Id": "8",
            }
        ]
    }
}

成员列表的对象中还有其他值,我刚刚省略了它们。 为了方便起见,我尝试通过以下方式解析字符串:

Map<String, Map<String, List<Map<String, dynamic>>>> m = json.decode(response.data);

但这会导致未处理的异常

Unhandled Exception: type '_InternalLinkedHashMap<String, dynamic>' is not a subtype of type 'Map<String, Map<String, List<Map<String, dynamic>>>>'

当我尝试将其作为具有String键和动态值的简单Map进行处理时,突然没有抱怨,并且可以从第一个示例中访问元素,就好像它们是复杂类型一样。为什么第二个示例有效而第一个无效?

Map<String, dynamic> m = json.decode(response.data);
print(m['Members']['Member'][1]); // clearly map of map of lists, right?

2 个答案:

答案 0 :(得分:1)

尝试使用这种方式:

        Map<String, dynamic> data = json.decode(response.data);
        Map<String, dynamic> members = data["members"];
        List member = members["member"];

答案 1 :(得分:1)

检查响应类型。数据

var responseDataType = response.data;
print(responseDatatype.runtimetype);

如果您的情况下response.data类型与参数类型m不同,则会引发这样的错误

argument type of 'Map<String, Map<String, List<Map<String, dynamic>>>>' can't be assigned to the parameter type of 'String'

当您传递Map dynamic的值类型时,在编写时效果很好

Map<String, dynamic> m = json.decode(response.data);

这里Map的键类型是String,值类型应该与response.data类型相同,我认为是因为发生了此错误。

在我处理json数据或http请求的情况下,我曾经定义一个单独的类来像这样用适当的类型对数据进行建模(结构化)

import 'dart:convert';

void main() {
  // In run time dart doesn't know what is the type of url and id. So, its better to make model for
  // handling json data defining a separate class.
  var responseData = '{"url": "https://twitter.com/", "id": 1}';

  var parsedJson = json.decode(responseData); // .decode alwasys return _JsonMap

  var jsonModel = JsonModel.fromJson(parsedJson);

  print(jsonModel.id);
  print(jsonModel.url);

}

class JsonModel {
  int id;
  String url;

  JsonModel.fromJson(parsedJson) {
    this.id = parsedJson["id"];
    this.url = parsedJson["url"];
  }
}