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

问题描述 投票:1回答:2

我希望有人能够在解析JSON的同时向我解释一些奇怪的行为。

这是我的JSON字符串:

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

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

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>>>>'

当我尝试将其作为带有字符串键和动态值的简单映射处理时,突然没有抱怨,我可以像第一个示例中那样访问元素,就像它们是复杂类型一样。为什么第二个例子有效,首先没有?

Map<String, dynamic> m = json.decode(response.data);
print(m['Members']['Member'][1]); // clearly map of map of lists, right?
json dart flutter
2个回答
1
投票

尝试使用这种方式:

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

1
投票

检查response.data的类型

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动态的值类型时,它在你写的时候工作正常

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"];
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.