我希望有人能够在解析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?
尝试使用这种方式:
Map<String, dynamic> data = json.decode(response.data);
Map<String, dynamic> members = data["members"];
List member = members["member"];
检查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"];
}
}