// Copyright (c) 2018, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. import 'package:json_annotation/json_annotation.dart'; part 'generic_class.g.dart'; @JsonSerializable() class GenericClass { @JsonKey(fromJson: _dataFromJson, toJson: _dataToJson) Object fieldObject; @JsonKey(fromJson: _dataFromJson, toJson: _dataToJson) dynamic fieldDynamic; @JsonKey(fromJson: _dataFromJson, toJson: _dataToJson) int fieldInt; @JsonKey(fromJson: _dataFromJson, toJson: _dataToJson) T fieldT; @JsonKey(fromJson: _dataFromJson, toJson: _dataToJson) S fieldS; GenericClass(); factory GenericClass.fromJson(Map json) => _$GenericClassFromJson(json); Map toJson() => _$GenericClassToJson(this); static T _dataFromJson(Map input, [S other1, U other2]) => input['value'] as T; static Map _dataToJson(T input, [S other1, U other2]) => {'value': input}; } @JsonSerializable() @_DurationMillisecondConverter() @_DurationListMillisecondConverter() class GenericClassWithConverter { @_SimpleConverter() Object fieldObject; @_SimpleConverter() dynamic fieldDynamic; @_SimpleConverter() int fieldInt; @_SimpleConverter() T fieldT; @_SimpleConverter() S fieldS; Duration duration; List listDuration; GenericClassWithConverter(); factory GenericClassWithConverter.fromJson(Map json) => _$GenericClassWithConverterFromJson(json); Map toJson() => _$GenericClassWithConverterToJson(this); } class _SimpleConverter implements JsonConverter> { const _SimpleConverter(); @override T fromJson(Map json) => json['value'] as T; @override Map toJson(T object) => {'value': object}; } class _DurationMillisecondConverter implements JsonConverter { const _DurationMillisecondConverter(); const _DurationMillisecondConverter.named(); @override Duration fromJson(int json) => json == null ? null : Duration(milliseconds: json); @override int toJson(Duration object) => object?.inMilliseconds; } class _DurationListMillisecondConverter implements JsonConverter, int> { const _DurationListMillisecondConverter(); @override List fromJson(int json) => [Duration(milliseconds: json)]; @override int toJson(List object) => object?.fold(0, (sum, obj) { return sum + obj.inMilliseconds; }); }