将http响应转换为Flutter列表

问题描述 投票:0回答:4

我在将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]"}]}}"
dart flutter
4个回答
1
投票

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));

我希望这就是你要找的东西。


1
投票

您还应该提供要从中检索id的对象的位置。你试过这个吗?

例:

var id = ['data']['logsread'][0]['id'];
var email= ['data']['logsread'][0]['email'];

我大多是这样做的。


1
投票

你的解析是正确的,但我认为这不是比较地图列表的正确方法。我认为做==你只是比较对象而不是它们的内容。

我建议你查看here的地图比较和here列表比较。

这样你就会检查内容,而不是粗略的对象(这是两个不同的实例,所以从技术上来说,即使它们具有相同的内容,它们也是不同的)。


0
投票

尝试先转换成地图然后再使用

import 'dart:convert';

//Decode response string to map
Map<String, dynamic> map = json.decode("jsonString");

xyz = map['data']['logsread'];
© www.soinside.com 2019 - 2024. All rights reserved.