从firebase解析迭代的json

发布于 2025-02-12 11:06:44 字数 2788 浏览 0 评论 0原文

如图所示,我将数据保存到实时燃料中作为迭代JSON。

实时壁炉数据

[
  {
    "name": "Math",
    "subMenu": [
      {
        "name": "Math1",
        "subMenu": [
          {
            "name": "Math 1.1"
          },
          {
            "name": "Math 1.2",
            "subMenu": [
              {
                "name": "Math 1.2.1",
                "subMenu": [
                  {
                    "name": "Math 1.2.1.1"
                  },
                  {
                    "name": "Math 1.2.1.2"
                  }
                ]
              },
              {
                "name": "Math 1.2.2"
              }
            ]
          }
        ]
      },
      {
        "name": "Math2"
      },
      {
        "name": "Math3",
        "subMenu": [
          {
            "name": "Math 1.3.1"
          },
          {
            "name": "Math 1.3.2"
          }
        ]
      }
    ]
  },
  {
    "name": "Marketing",
    "subMenu": [
      {
        "name": "Promotions",
        "subMenu": [
          {
            "name": "Catalog Price Rule"
          },
          {
            "name": "Cart Price Rules"
          }
        ]
      },
      {
        "name": "Communications",
        "subMenu": [
          {
            "name": "Newsletter Subscribers"
          }
        ]
      }
    ]
  }
]

json在实时firebase '单击图像'

datamodel.dart.dart.dart

class Menu {
  String? name;
  int? font;
  List<Menu>? subMenu = [];

  Menu({this.name, this.subMenu, this.font});

  Menu.fromJson(Map<String, dynamic> json) {
    font = json['font'];
    name = json['name'];

    if (json['subMenu'] != null) {
      json['subMenu'].forEach((v) {
        subMenu?.add(Menu.fromJson(v));
      });
    }
  }
}

我的目标是构建反射迭代的JSON结构的多级列表视图。因此,我实施了一种返回list&lt;菜单&gt;的方法,然后将其传递到futurebuilder以构建多级列表视图。

方法。

final ref = FirebaseDatabase.instance.ref();

  Future<List<Menu>> firebaseCalls(DatabaseReference ref) async {
    final snapshot = await ref.child('Task').get();
    final jsondata = snapshot.value as Map<String, dynamic>;
    final list = json.decode(jsondata) as List<dynamic>; // Error Location
    return list.map((e) => Menu.fromJson(e)).toList();
  }

,我得到了以下

错误 错误:参数类型'map&lt; string,dynamic&gt;'无法分配给参数类型“字符串”。 (grognal_type_not_assignable在[flutter_multilevel_list_from_json] lib \ main.dart:28)

试图将列表类型更改为list&lt; dynamic&lt; dynamic&gt;,但仍然给我错误。

I have data saved into Realtime Firebase as an iterative JSON as shown in the picture.

Realtime Firebase data

[
  {
    "name": "Math",
    "subMenu": [
      {
        "name": "Math1",
        "subMenu": [
          {
            "name": "Math 1.1"
          },
          {
            "name": "Math 1.2",
            "subMenu": [
              {
                "name": "Math 1.2.1",
                "subMenu": [
                  {
                    "name": "Math 1.2.1.1"
                  },
                  {
                    "name": "Math 1.2.1.2"
                  }
                ]
              },
              {
                "name": "Math 1.2.2"
              }
            ]
          }
        ]
      },
      {
        "name": "Math2"
      },
      {
        "name": "Math3",
        "subMenu": [
          {
            "name": "Math 1.3.1"
          },
          {
            "name": "Math 1.3.2"
          }
        ]
      }
    ]
  },
  {
    "name": "Marketing",
    "subMenu": [
      {
        "name": "Promotions",
        "subMenu": [
          {
            "name": "Catalog Price Rule"
          },
          {
            "name": "Cart Price Rules"
          }
        ]
      },
      {
        "name": "Communications",
        "subMenu": [
          {
            "name": "Newsletter Subscribers"
          }
        ]
      }
    ]
  }
]

How the JSON look like in Realtime Firebase
'Click the image'

datamodel.dart

class Menu {
  String? name;
  int? font;
  List<Menu>? subMenu = [];

  Menu({this.name, this.subMenu, this.font});

  Menu.fromJson(Map<String, dynamic> json) {
    font = json['font'];
    name = json['name'];

    if (json['subMenu'] != null) {
      json['subMenu'].forEach((v) {
        subMenu?.add(Menu.fromJson(v));
      });
    }
  }
}

My goal is to build a multilevel list view in Flutter that reflexes iterative JSON structure. So, I implemented a method that returns List<Menu>, and then pass it to a Futurebuilder to build a multilevel list View.

The method.

final ref = FirebaseDatabase.instance.ref();

  Future<List<Menu>> firebaseCalls(DatabaseReference ref) async {
    final snapshot = await ref.child('Task').get();
    final jsondata = snapshot.value as Map<String, dynamic>;
    final list = json.decode(jsondata) as List<dynamic>; // Error Location
    return list.map((e) => Menu.fromJson(e)).toList();
  }

and I got the following

The Error
error: The argument type 'Map<String, dynamic>' can't be assigned to the parameter type 'String'. (argument_type_not_assignable at [flutter_multilevel_list_from_json] lib\main.dart:28)

tried to change the list type to List<dynamic> but still give me an error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

王权女流氓 2025-02-19 11:06:44

json.decode()将字符串作为输入,然后将map&lt; string,dynamic&gt;传递到其中。

那是您的问题,不是您试图将其施加到list&lt; dynamic&gt;

json.decode() takes a String as input, and you are passing a Map<String,dynamic> into it.

That is your problem, not that you are trying to cast it to a List<dynamic>

梦屿孤独相伴 2025-02-19 11:06:44

可能这将是有用的(jsondata作为列表).map((e)=&gt; menu.fromjson(e))。tolist();>

May be this will be helpful (jsondata as List).map((e) => Menu.fromJson(e)).toList();

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文