Невозможно выполнить итерацию по объекту JSON из-за нежелательных ключей - PullRequest
1 голос
/ 10 июля 2020

Мой JSON объект ответа похож на этот

{
    "response": "success",
    "message": "done",
    "data": {
        "orders": {
            "order4": {
                "OrderId": "4",
                "OrderSubTotal": "568",
                "Items": {
                    "1": {
                        "ProductName": "Prod 1",
                        "ItemDiscount": "10",
                        "Quantity": "3",
                        "TotalItemPrice": "161.865"
                    },
                    "2": {
                        "ProductName": "Prod 2",
                        "ItemDiscount": "0",
                        "Quantity": "5",
                        "TotalItemPrice": "449.75"
                    }
                },
                "order6": {
                    "OrderId": "6",
                    "total": "789",
                    "Items": {
                        "1": {
                            "ProductName": "Prod 1",
                            "ItemDiscount": "10",
                            "Quantity": "3",
                            "TotalItemPrice": "161.865"
                        },
                        "2": {
                            "ProductName": "Prod 2",
                            "ItemDiscount": "0",
                            "Quantity": "5",
                            "TotalItemPrice": "449.75"
                        }
                    }
                }

            }
        }
    }
}

Проблема в том, что я не могу выполнять итерацию по полям, поскольку я получаю случайные ключи, такие как order6, order4. Итак, есть ли способ удалить эти ключи из объекта и создать красивый чистый объект JSON. Я кодирую на языке дротиков.

Ответы [ 2 ]

0 голосов
/ 10 июля 2020

Просто посмотрите этот пример, который я сделал на основе json, который вы предоставили:

Ниже приведен ваш образец json, который вы предоставили:

{
    "response": "success",
    "message": "done",
    "data": {
        "orders": {
            "order6": {
                "OrderId": "6",
                "total": "789",
                "Items": {
                    "1": {
                        "ProductName": "Prod 1",
                        "ItemDiscount": "10",
                        "Quantity": "3",
                        "TotalItemPrice": "161.865"
                    },
                    "2": {
                        "ProductName": "Prod 2",
                        "ItemDiscount": "0",
                        "Quantity": "5",
                        "TotalItemPrice": "449.75"
                    }
                }
            },
            "order4": {
                "OrderId": "4",
                "OrderSubTotal": "568",
                "Items": {
                    "1": {
                        "ProductName": "Prod 1",
                        "ItemDiscount": "10",
                        "Quantity": "3",
                        "TotalItemPrice": "161.865"
                    },
                    "2": {
                        "ProductName": "Prod 2",
                        "ItemDiscount": "0",
                        "Quantity": "5",
                        "TotalItemPrice": "449.75"
                    }
                }
            }
        }
    }
}

На основе json Я сделал для вас пользовательский интерфейс, чтобы вы могли показать детали заказа:

import 'dart:convert';

import 'package:flutter/material.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: HomePage());
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  List<Order> ordersList = List();
  @override
  void initState() {
    super.initState();
    getData();
  }

  getData() async {
    String data =
        await DefaultAssetBundle.of(context).loadString("json/parse.json");

    Map newMap = json.decode(data);

    newMap['data'].forEach((k, v) {
      
      v.forEach((key, val) {
        String ordername = key;
        List<Item> items = List();
       
        
        val['Items'].forEach((key, value) {
          print('sample');
          Item item = Item(
            productNumber: key,
            productName: value['ProductName'],
            itemDiscount: value['ItemDiscount'],
            quantity: value['Quantity'],
            totalItemPrice: value['TotalItemPrice'],
          );
          items.add(item);

          print(key);
          print(value);
          print('length is :${items.length}');
        });

        Order order = Order(
            orderId: val['OrderId'],
            orderName: ordername,
            total: val['total'],
            items: items);

        ordersList.add(order);
      });
    });
    setState(() {});

    print('This is the list : count ${ordersList.length}');
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
        body: Container(
      child: ListView.builder(
          itemCount: ordersList.length,
          shrinkWrap: true,
          itemBuilder: (context, index) {
            var order = ordersList[index];
            return Card(
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: <Widget>[
                  Text('Order Name : ${order.orderName}'),
                  Text('Order Id : ${order.orderId}'),
                  Text('Order total : ${order.total}'),
                  Text('Order Items: ${order.items.length}')
                ],
              ),
            );
          }),
    ));
  }
}

class Order {
  final String orderName;
  final String orderId;
  final String total;
  final List<Item> items;

  Order({this.orderName, this.orderId, this.total, this.items});
}

class Item {
  Item({
    this.productName,
    this.itemDiscount,
    this.quantity,
    this.totalItemPrice,
    this.productNumber,
  });
  String productNumber;
  String productName;
  String itemDiscount;
  String quantity;
  String totalItemPrice;
}


Может быть, я запутался только в том, что json, который вы указали, является правильным, пожалуйста, проверьте, так как в нем есть order6 внутри заказа 4 , и есть параметры ухода для OrderSubTotal и total, просто дайте мне знать, если все в порядке.

Просто проверьте и дайте мне знать, работает ли он

0 голосов
/ 10 июля 2020

Если я понял, что вы хотите, SplayTreeMap.from(map, comparator) выполнит эту работу за вас, как показано в приведенном ниже коде:

import 'dart:convert';
import 'dart:collection';

void main() {
  String str = r'''{
    "response": "success",
    "message": "done",
    "data": {
        "orders": {
            "order6": {
                "OrderId": "6",
                "total": "789",
                "Items": {
                    "1": {
                        "ProductName": "Prod 1",
                        "ItemDiscount": "10",
                        "Quantity": "3",
                        "TotalItemPrice": "161.865"
                    },
                    "2": {
                        "ProductName": "Prod 2",
                        "ItemDiscount": "0",
                        "Quantity": "5",
                        "TotalItemPrice": "449.75"
                    }
                }
            },
            "order4": {
                "OrderId": "4",
                "OrderSubTotal": "568",
                "Items": {
                    "1": {
                        "ProductName": "Prod 1",
                        "ItemDiscount": "10",
                        "Quantity": "3",
                        "TotalItemPrice": "161.865"
                    },
                    "2": {
                        "ProductName": "Prod 2",
                        "ItemDiscount": "0",
                        "Quantity": "5",
                        "TotalItemPrice": "449.75"
                    }
                }
            }
        }
    }
}''';
  
  final sortedMap = new SplayTreeMap<String,dynamic>.from(jsonDecode(str)["data"]["orders"], (a,b)=>a.compareTo(b));
  print(sortedMap);
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...