我希望有人能向我解释一下在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>>>>'
当我尝试将其作为具有字符串键和动态值的简单Map处理时,突然就没有抱怨了,而且我可以像访问第一个示例中的复杂类型一样访问元素。为什么第二个例子可以工作,而第一个不能?
Map<String, dynamic> m = json.decode(response.data);
print(m['Members']['Member'][1]); // clearly map of map of lists, right?
发布于 2019-04-16 02:55:07
尝试使用以下方法:
Map<String, dynamic> data = json.decode(response.data);
Map<String, dynamic> members = data["members"];
List member = members["member"];
发布于 2019-04-16 07:03:27
检查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 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"];
}
}
https://stackoverflow.com/questions/55699000
复制