Многомерный массив неизвестной глубины в цикле flutter из JSON

#arrays #loops #flutter #dart #multidimensional-array

#массивы #циклы #flutter #dart #многомерный массив

Вопрос:

У меня есть массив, и этот массив я получаю из JSON, но этот массив неизвестен, насколько он глубокий, и я просто хочу сделать его 2-мя измерениями parrent и children. Я привожу в пример только 3 измерения, но в реальном случае это может быть неизвестно.

Этот массив имеет один и тот же объект от родительского и дочернего элементов. Вы можете увидеть пример здесь.

Из этого :

 {
  "brand_id": "1",
  "name": "Civic",
  "type": "Sedan",
  "children": [
    {
      "brand_id": "1",
      "name": "Civic Type-R",
      "type": "Sedan",
      "children": [
        {
          "brand_id": "1",
          "name": "Civic Type-R 2020",
          "type": "Sedan",
          "children": [
            {
              "brand_id": "1",
              "name": "Civic Type-R 2020 A",
              "type": "Sedan"
            },
            {
              "brand_id": "1",
              "name": "Civic Type-R 2020 B",
              "type": "Sedan"
            }
          ]
        },
        {
          "brand_id": "1",
          "name": "Civic Type-R 2019",
          "type": "Sedan",
          "children": [
            {
              "brand_id": "1",
              "name": "Civic Type-R 2019 A",
              "type": "Sedan"
            }
          ]
        }
      ]
    }
  ]
}
  

Я надеюсь, что пример может быть таким :

 {
  "brand_id": "1",
  "name": "Civic",
  "type": "Sedan",
  "children": [
    {
      "brand_id": "1",
      "name": "Civic Type-R",
      "type": "Sedan"
    },
    {
      "brand_id": "1",
      "name": "Civic Type-R 2020",
      "type": "Sedan"
    },
    {
      "brand_id": "1",
      "name": "Civic Type-R 2020 A",
      "type": "Sedan"
    },
    {
      "brand_id": "1",
      "name": "Civic Type-R 2020 B",
      "type": "Sedan"
    },
    {
      "brand_id": "1",
      "name": "Civic Type-R 2019",
      "type": "Sedan"
    },
    {
      "brand_id": "1",
      "name": "Civic Type-R 2019 A",
      "type": "Sedan"
    }
  ]
}
  

Спасибо.

Комментарии:

1. Можете ли вы привести более простой пример или, по крайней мере, правильно его отформатировать. Это очень трудно прочитать и увидеть разницу.

2. Привет @Ridcully спасибо за ответ, можете ли вы отформатировать пример json с помощью viewer?

3. Пожалуйста, также отформатируйте первый JSON, чтобы мы могли лучше видеть различия

4. Хорошо сделано @Ridcully

Ответ №1:

Класс модели

 import 'dart:convert';

class MyModel {

  String brand_id;
  String name;
  String type;

  List<ChildrenModel> children;

  MyModel({
    this.brand_id,
    this.name,
    this.type,
    this.children,
  });

  factory MyModel.fromJson(Map<String, dynamic> json) {
    return new MyModel(
      brand_id: json['brand_id'].toString(),
      name: json['name'].toString(),
      type: json['type'].toString(),
      children: (json['children']  as List).map((i) => ChildrenModel.fromJson(i)).toList(),
    );
  }


}

class ChildrenModel {

  String brand_id;
  String name;
  String type;

  ChildrenModel({
    this.brand_id,
    this.name,
    this.type,
  });

  factory ChildrenModel.fromJson(Map<String, dynamic> json) {
    return new ChildrenModel(
      brand_id: json['brand_id'].toString(),
      name: json['name'].toString(),
      type: json['type'].toString(),
    );
  }
}
  

Ответ №2:

Вы можете ссылаться на один и тот же объект класса внутри класса

 class Brand{
  String id;
  String name;
  Strng type;
  List<Brand> children;

  Brand({this.id, this.name, this.type, this.children});

   Brand.fromJson(Map<String, dynamic> json) {
    id = json['brand_id'];
    name = json['name'];
    type = json['type'];
    if (json['children'] != null) {
      children = new List<Brand>();
      json['children'].forEach((v) {
        children.add(Brand.fromJson(v));
      });
    }
  }

  Map<String, dynamic> toJson() {
    final Map<String, dynamic> data = new Map<String, dynamic>();
    data['brand_id'] = this.id;
    data['name'] = this.name;
    data['type'] = this.type;
    if (this.children != null) {
      data['children'] = this.children.map((v) => v.toJson()).toList();
    }
    return data;
  }
}

  

Создайте свою модель следующим образом и соответствующим образом преобразуйте json.