我希望有人可以在扑朔迷离地解析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?
答案 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"];
}
}