我在将HTTP响应正文转换为Flutter列表时遇到问题。在调试器中,jsonDecode(response.body)['data']['logsread']
的输出看起来很像
[
{
"id": "9fd66092-1f7c-4e60-ab8f-5cf7e7a2dd3b",
"email": "[email protected]"
}
]
然而,这会返回错误。
print((jsonDecode(response.body)['data']['logsread']) ==
[{
"id": "9fd66092-1f7c-4e60-ab8f-5cf7e7a2dd3b",
"email": "[email protected]"
}]); // This returns false.
仅供参考。 response.body =>
"{"data":{"logsread":[{"id":"9fd66092-1f7c-4e60-ab8f-5cf7e7a2dd3b","email":"[email protected]"}]}}"
JsonDecode返回List <dynamic>,但您的另一个列表的类型为List <Map <String,String >>。因此,通过创建任何模型并覆盖==和哈希码,将其转换为相同类型的列表。
并且要比较两个列表,你需要ListEquality函数。例如:
Function eq = const ListEquality().equals;
print(eq(list1,list2));
我尝试了你的代码并完成了我的方式,检查这是否可以。
型号类:
class Model {
String id;
String email;
Model({
this.id,
this.email,
});
factory Model.fromJson(Map<String, dynamic> json) => new Model(
id: json["id"],
email: json["email"],
);
Map<String, dynamic> toJson() => {
"id": id,
"email": email,
};
@override
bool operator ==(Object other) =>
identical(this, other) ||
other is Model &&
runtimeType == other.runtimeType &&
id == other.id &&
email == other.email;
@override
int get hashCode =>
id.hashCode ^
email.hashCode;
}
main.dart
import 'package:collection/collection.dart';
var body =
'{"data":{"logsread":[{"id":"9fd66092-1f7c-4e60-ab8f-5cf7e7a2dd3b","email":"[email protected]"}]}}';
var test1 = (jsonDecode(body)['data']['logsread'] as List)
.map((value) => Model.fromJson(value))
.toList();
var test2 = ([
{"id": "9fd66092-1f7c-4e60-ab8f-5cf7e7a2dd3b", "email": "[email protected]"}
]).map((value)=>Model.fromJson(value)).toList();
Function eq = const ListEquality().equals;
print(eq(test1,test2));
我希望这就是你要找的东西。
您还应该提供要从中检索id的对象的位置。你试过这个吗?
例:
var id = ['data']['logsread'][0]['id'];
var email= ['data']['logsread'][0]['email'];
我大多是这样做的。
尝试先转换成地图然后再使用
import 'dart:convert';
//Decode response string to map
Map<String, dynamic> map = json.decode("jsonString");
xyz = map['data']['logsread'];