как сгруппировать json?

нужно сгруппировать следующий json по ключу "name" и суммировать значения ключа "economy":

[
  {
    "name": "name1",
    "economy": 30.0,
    "abp": "abp1_1"
  },
  {
    "name": "name1",
    "economy": 20.0,
    "abp": "abp1_2"
  },
  {
    "name": "name2",
    "economy": 32.0,
    "abp": "abp2_1"
  },
  
  {
    "name": "name2",
    "economy": 31.2,
    "abp": "abp2_2"
  }
]

на выходе я должен получить следующее:

[
  {
    "name": "name1",
    "economy": 40.0,
    "items": [
      {
        "name": "name1",
        "economy": 30.0,
        "abp": "abp1_1"
      },
      {
        "name": "name1",
        "economy": 20.0,
        "abp": "abp1_2"
      }
    ]
  },
  {
    "name": "name2",
    "economy": 63.2,
    "items": [
      {
        "name": "name2",
        "economy": 32.0,
        "abp": "abp2_1"
      },
      {
        "name": "name2",
        "economy": 31.2,
        "abp": "abp2_2"
      }
    ]
  }
]

Ответы (1 шт):

Автор решения: Mr.AntonDer

По первому запросу, выдаётся библиотека

Документация, вязатя из библиотеки:

Импорт либо

import "package:serialization/serialization.dart" или

import "package:serialization/serialization_mirrors.dart" в зависимости от того, нужны ли вам зеркальные правила. Они более удобны, но вызывают увеличение размера кода в dartj2s.

Чтобы использовать трансформатор, включите в pubspec что-то вроде

transformers:
  - serialization :
    $include: ["lib/stuff.dart", "lib/more_stuff.dart"]

Затем настройте сгенерированные правила в экземпляре сериализации, а затем вызовите функцию write(). Правила сериализации будут называться так же, как имя файла модели с _serialization_rules добавлением к нему , так что в случае stuff.dartstuff_serialization_rules.dart, если он находится в том же каталоге, что и оригинал.

Обычно вы никогда не увидите эти файлы, потому что трансформатор создает его на лету, и он отправляется непосредственно в pub serve или в dart2js, никогда не записываясь на диск. Чтобы увидеть сгенерированный код, запустите pub build в режиме отладки, например , если в каталоге пакета есть программа binдля запуска чего -либо с помощью этих файлов, то

pub build --mode=debug bin будет генерировать код для этого, а также регистрировать, какие файлы были сгенерированы, в виде

Generated serialization rules in my_package|lib/stuff_serialization_rules.dart Кроме того, можно запустить код трансформатора вне трансформатора, что полезно для отладки или использования кода по -другому. Пример этого см. в разделе "test/transformer/generate_standalone.dart".

Код каталога bin будет выглядеть примерно так.

import 'package:my_package/stuff_serialization_rules.dart' as foo;
 ...
 var serialization = new Serialization();
 foo.rules.values.forEach(serialization.addRule);
 ...
 sendToClient(serialization.write(somePerson));
а на клиенте сделайте что-нибудь вроде

 p = readFromServer(personId).then((data) => serialization.read(data));

В качестве альтернативы, если вы используете зеркальные правила, просто сообщите сериализации, какие классы могут быть сериализованы.

var serialization = new Serialization()
  ..addRuleFor(Person);
  ..addRuleFor(Address);
serialization.write(address);

Для получения более конкретных примеров см. testКаталог, и особенно для примеров трансформатора может быть полезно посмотреть pubspec.yamlна этот пакет и test/transformer каталог.


Если вдруг, библиотека перестанет поддерживаться, то будущие поситители смогут найти второй вариант решения данной проблемы тут

→ Ссылка